home *** CD-ROM | disk | FTP | other *** search
- ⓪ IMPLEMENTATION MODULE GMEKernel;
- ⓪
- ⓪ (* !JL 11.12.90 - LCAP entfernt --> CAP
- ⓪$TT 14.12.90 "BlockMarkiert" neu (s.u.); Wenn Block falsch markiert
- ⓪2(Marke1 hinter Marke2), dann wird er weder invertiert
- ⓪2noch kopiert. "LoescheBlockMarken" in zwei Subroutines
- ⓪2aufgeteilt. "MarkiereBlockAnfang/Ende" setzen Block nur,
- ⓪2wenn Marken gültig sind.
- ⓪2"SetCharposToEndOfLine" als optimierte Subroutine.
- ⓪2Optimierungen in "MakeHighLine"
- ⓪ *)
- ⓪
- ⓪ (*$Y+,Z+,R-*)
- ⓪
- ⓪ (* Zusammenziehung von:
- ⓪#EditKernel, EditUtil, EditScreen.
- ⓪ *)
- ⓪
- ⓪
- ⓪ (********************* IMPLEMENTATION GMEKernel ************************)
- ⓪
- ⓪ (* FROM Storage IMPORT ALLOCATE; *)
- ⓪ FROM Granule IMPORT ALLOCATE;
- ⓪
- ⓪ FROM FastStrings IMPORT Assign, Append, Copy, Delete, Pos, Insert;
- ⓪ IMPORT Strings;
- ⓪
- ⓪ FROM SYSTEM IMPORT ADDRESS, ADR, CAST;
- ⓪
- ⓪ (* FROM MyConversions IMPORT CardToStr, StrToCard; *)
- ⓪ FROM Convert IMPORT ConvCard;
- ⓪ FROM StrConv IMPORT StrToCard;
- ⓪
- ⓪ FROM AESWindows IMPORT UpdateWindow, WindowRectList, firstElem, nextElem;
- ⓪ FROM VDIControls IMPORT SetClipping, DisableClipping;
- ⓪ FROM GrafBase IMPORT Rectangle;
- ⓪
- ⓪ FROM GMEBase IMPORT einBefehl, Befehlssatz,
- ⓪(PuffRecSize, cRevision, cZeile,
- ⓪(MausBusy, Nachricht,
- ⓪(GotoXY, LoescheZeile,
- ⓪(InitBuffer,
- ⓪(ScreenHandle, WindowHandle,
- ⓪(WriteConst, WriteChar, WriteLn, WriteLine, LinesOnScreen, backspace,
- ⓪(einButton, ButtonSet, MausPos, FrageJaNein, Ja, Nein,
- ⓪(cr, eot, tab, nul, escape, lineins, linedel, Trace,
- ⓪(GetDirectory, MausEin, CursorEin, CursorAus, HighLight, Normal,
- ⓪(GetVersion, InsertLn, DeleteLn, CharsInLine, MausAus,
- ⓪(DeleteTail, LoescheBild, LoescheEndeBild, WhereXY,
- ⓪(CharHeight, ScreenHeight, ScreenWidth, AutoCount,
- ⓪(einPufferPointer, MerkIndex,
- ⓪(eineZeile, eineInfo, einLinePointer, aLine,
- ⓪(einMerkPointer, Mode, Moden,
- ⓪(einMerkPunkt,
- ⓪(CharSet,
- ⓪(Init, GetLine, PutLine, Loeschen,
- ⓪(DeAllocLine, AllocLine,
- ⓪(undone, InsertPuffer, PuffInit,
- ⓪(UndoPuffer,
- ⓪(ClipBoard,
- ⓪(HilfsPuffer,
- ⓪(ConfigPuffer,
- ⓪(EditPuffer,
- ⓪(AlternEdit,
- ⓪(DruckPuff,
- ⓪(FehlerPuffer,
- ⓪(MailPuffer,
- ⓪(GolemPuffer,
- ⓪(SendePuffer,
- ⓪(Tausch,
- ⓪(PSCPuffer,
- ⓪(LoadPuffer,
- ⓪(DruckerBatch,
- ⓪((*TextVergleich,*) (* Namenskonflikt! *)
- ⓪(WaehlPuffer,
- ⓪(StartPuffer,
- ⓪(Puffer1, Puffer2,
- ⓪(Puffer3, Puffer4;
- ⓪
- ⓪ (********************** EditUtil ***************************)
- ⓪
- ⓪ FROM GMEConfig IMPORT einTasteneintrag, LoescheQueue, LiesZeichen,
- ⓪"TasteBereit, LiesTaste, einTastenTyp;
- ⓪
- ⓪
- ⓪ (***************************** EditScreen *************************)
- ⓪ (*
- ⓪ FROM EditKernel IMPORT SucheZeilenNummer;
- ⓪ *)
- ⓪
- ⓪
- ⓪
- ⓪ (************************* EditKernel *******************************)
- ⓪
- ⓪ CONST PhantomTrenn = 37C;
- ⓪
- ⓪ (*VAR ok: BOOLEAN;*)
- ⓪
- ⓪ PROCEDURE DoBackspace (Puff: einPufferPointer);
- ⓪ VAR string: eineZeile;
- ⓪(merkZeile1: CARDINAL;
- ⓪(dummyC: CARDINAL;
- ⓪(returnX: CARDINAL;
- ⓪ BEGIN
- ⓪"WITH Puff^ DO
- ⓪$IF MerkPunkte [LaufendeZeile].merkline^.vorige # Puffer THEN
- ⓪&MerkPunkte [LaufendeZeile].charpos :=
- ⓪(LENGTH (MerkPunkte [LaufendeZeile].merkline^.vorige^.ZeilPointer^);
- ⓪&IF (MerkPunkte [LaufendeZeile].charpos +
- ⓪'LENGTH (MerkPunkte [LaufendeZeile].merkline^.ZeilPointer^)) <= Max THEN
- ⓪(GetLine (MerkPunkte [LaufendeZeile].merkline^.vorige, string);
- ⓪(Append (MerkPunkte [LaufendeZeile].merkline^.ZeilPointer^, string);
- ⓪(PutLine (MerkPunkte [LaufendeZeile].merkline^.vorige, string);
- ⓪(DeleteLine (Puff, MerkPunkte [LaufendeZeile].merkline, TRUE, FALSE);
- ⓪((* IF MerkPunkte [LaufendeZeile].merkline^.naechste # NIL THEN *)
- ⓪*LineUp (Puff);
- ⓪((* END (* IF nicht schon letzte Zeile - LineUp durch DeleteLine *); *)
- ⓪(CursorAus;
- ⓪(GotoXY (0, MerkPunkte [LaufendeZeile].zeilpos -
- ⓪3MerkPunkte [ErsteZeile].zeilpos);
- ⓪(WriteString (MerkPunkte [ErsteZeile].charpos,
- ⓪5(*ControlZeichen IN Modus, TabFiltern IN Modus,*)
- ⓪5MerkPunkte [LaufendeZeile].merkline^.ZeilPointer^);
- ⓪&ELSE LineUp (Puff);
- ⓪&END (* IF Laenge der beiden Zeilen... *);
- ⓪$END (* IF *);
- ⓪"END (* WITH *);
- ⓪ END DoBackspace;
- ⓪
- ⓪ PROCEDURE DoDelete (Puff: einPufferPointer);
- ⓪ VAR string: eineZeile;
- ⓪(letzte: BOOLEAN;
- ⓪(merkZeile1: CARDINAL;
- ⓪(dummyC: CARDINAL;
- ⓪(returnX: CARDINAL;
- ⓪ BEGIN
- ⓪"WITH Puff^ DO
- ⓪$IF MerkPunkte [LaufendeZeile].merkline^.naechste # NIL THEN
- ⓪&IF (LENGTH (MerkPunkte [LaufendeZeile].merkline^.ZeilPointer^) +
- ⓪*LENGTH (MerkPunkte [LaufendeZeile].merkline^.naechste^.ZeilPointer^))
- ⓪+<= Max THEN
- ⓪(GetLine (MerkPunkte [LaufendeZeile].merkline, string);
- ⓪(Append (MerkPunkte [LaufendeZeile].merkline^.naechste^.ZeilPointer^,
- ⓪0string);
- ⓪(PutLine (MerkPunkte [LaufendeZeile].merkline, string);
- ⓪(LineDown (Puff);
- ⓪((* letzte := MerkPunkte [LaufendeZeile].merkline^.naechste = NIL; *)
- ⓪(DeleteLine (Puff, MerkPunkte [LaufendeZeile].merkline, TRUE, FALSE);
- ⓪(LineUp (Puff);
- ⓪(CursorAus;
- ⓪(GotoXY (0, MerkPunkte [LaufendeZeile].zeilpos - MerkPunkte [ErsteZeile].zeilpos);
- ⓪(WriteString (MerkPunkte [ErsteZeile].charpos,
- ⓪5(*ControlZeichen IN Modus, TabFiltern IN Modus,*)
- ⓪5MerkPunkte [LaufendeZeile].merkline^.ZeilPointer^);
- ⓪&END (* IF Laenge der beiden Zeilen... *);
- ⓪$END (* IF *);
- ⓪"END (* WITH *);
- ⓪ END DoDelete;
- ⓪
- ⓪ PROCEDURE DoCR (Puff: einPufferPointer; zeigen: BOOLEAN;
- ⓪0VAR returnX: CARDINAL);
- ⓪ VAR string: eineZeile;
- ⓪(PufZeile: eineZeile;
- ⓪((*$Reg*)l: CARDINAL;
- ⓪ BEGIN
- ⓪"WITH Puff^ DO
- ⓪
- ⓪$IF OverWrite IN Modus THEN
- ⓪&IF MerkPunkte [LaufendeZeile].merkline^.naechste = NIL THEN
- ⓪(InsertLine (Puff, '', AutoIndent IN Modus, zeigen, TRUE);
- ⓪&END (* IF *);
- ⓪&(* Nun gibt es auf jeden Fall eine nächste Zeile *)
- ⓪
- ⓪&WITH MerkPunkte [LaufendeZeile] DO
- ⓪(charpos := 0;
- ⓪&(* Wir prüfen nun ggf., wie weit die alte Zeile eingerückt war: *)
- ⓪(IF (AutoIndent IN Modus) THEN
- ⓪*WHILE merkline^.ZeilPointer^[charpos] IN CharSet {' ', tab} DO
- ⓪,INC (charpos);
- ⓪*END (* WHILE *);
- ⓪(END (* IF AutoIndent *);
- ⓪&END (* WITH *);
- ⓪
- ⓪&(* Nun zur nächsten (neuen) Zeile: *)
- ⓪&LineDown (Puff);
- ⓪&
- ⓪&IF (AutoIndent IN Modus) THEN
- ⓪(WITH MerkPunkte [LaufendeZeile] DO
- ⓪*(* Falls neue Zeile für Einrückung zu kurz, fülle sie auf: *)
- ⓪*l := LENGTH (merkline^.ZeilPointer^);
- ⓪*WHILE l < charpos DO
- ⓪,merkline^.ZeilPointer^[l] :=
- ⓪.merkline^.vorige^.ZeilPointer^[l];
- ⓪,INC (l);
- ⓪*END (* WHILE *);
- ⓪*merkline^.ZeilPointer^[l] := nul;
- ⓪"
- ⓪*(* Vielleicht war die neue Zeile aber schon weiter eingerückt: *)
- ⓪*WHILE merkline^.ZeilPointer^[charpos] IN CharSet {' ', tab} DO
- ⓪,INC (charpos);
- ⓪*END (* WHILE *);
- ⓪*
- ⓪*(* Oder sie ist weniger eingerückt: *)
- ⓪*WHILE (charpos > 0) & ~(merkline^.ZeilPointer^[charpos-1] IN
- ⓪ACharSet {' ', tab}) DO
- ⓪,DEC (charpos);
- ⓪*END (* WHILE *);
- ⓪(END (* WITH *);
- ⓪&END (* IF AutoIndent *);
- ⓪$ELSE (* nicht OverWrite *)
- ⓪&INCL (Modus, Editiert);
- ⓪&IF zeigen THEN
- ⓪(CursorAus;
- ⓪(GotoXY (MerkPunkte [LaufendeZeile].charpos -
- ⓪*MerkPunkte [ErsteZeile].charpos,
- ⓪*MerkPunkte [LaufendeZeile].zeilpos -
- ⓪,MerkPunkte [ErsteZeile].zeilpos);
- ⓪0(* SchirmZeile); *)
- ⓪(LoescheZeile;
- ⓪/(* Zeilenrest auf Bildschirm geloescht *)
- ⓪&END (* IF zeigen *);
- ⓪
- ⓪&returnX := MerkPunkte [LaufendeZeile].charpos;
- ⓪-(* Rest d. Zeile nach Cursor loeschen: *)
- ⓪&l := LENGTH (MerkPunkte [LaufendeZeile].merkline^.ZeilPointer^);
- ⓪&IF returnX < l THEN
- ⓪(Copy (MerkPunkte [LaufendeZeile].merkline^.ZeilPointer^, returnX,
- ⓪.l - returnX, PufZeile);
- ⓪&ELSE PufZeile [0] := nul;
- ⓪&END (* IF *);
- ⓪$
- ⓪,(* Neue Zeile mit gepuffertem Rest einfuegen: *)
- ⓪&InsertLine (Puff, PufZeile, AutoIndent IN Modus, zeigen, TRUE);
- ⓪,(* Rest in der alten Zeile loeschen: *)
- ⓪&GetLine (MerkPunkte [LaufendeZeile].merkline^.vorige, PufZeile);
- ⓪&Delete (PufZeile, returnX,
- ⓪.LENGTH (MerkPunkte [LaufendeZeile].merkline^.vorige^.ZeilPointer^)
- ⓪.- returnX);
- ⓪&PutLine (MerkPunkte [LaufendeZeile].merkline^.vorige, PufZeile);
- ⓪
- ⓪&IF ~(AutoIndent IN Modus) THEN MerkPunkte [LaufendeZeile].charpos := 0;
- ⓪&END (* IF *);
- ⓪$END (* IF OverWrite *);
- ⓪"END (* WITH Puff *);
- ⓪ END DoCR;
- ⓪
- ⓪ PROCEDURE ScrollUp (Puff: einPufferPointer; z: CARDINAL);
- ⓪ VAR (*$Reg*)i, (*$Reg*)j: CARDINAL;
- ⓪((*$Reg*)Help: einLinePointer;
- ⓪((*$Reg*)zeile: CARDINAL;
- ⓪ BEGIN
- ⓪"WITH Puff^ DO
- ⓪$zeile := MerkPunkte [ErsteZeile].zeilpos + 1;
- ⓪$CursorAus;
- ⓪$j := 1;
- ⓪$WHILE j <= z DO
- ⓪&WITH MerkPunkte [ErsteZeile] DO
- ⓪(IF (merkline^.naechste # NIL) &
- ⓪+(zeilpos + LinesOnScreen < ZeilenAnzahl) THEN
- ⓪*DeleteZeile (Puff, zeilpos + 1); (* oberste Zeile loeschen *)
- ⓪;(* DeleteZeile subtrahiert global y! *)
- ⓪*merkline := merkline^.naechste;
- ⓪*INC (zeilpos); (* global y! Basis erhoehen *)
- ⓪*INC (zeile);
- ⓪
- ⓪*(* Unterste Zeile neu schreiben: *)
- ⓪*i := 1; Help := MerkPunkte [ErsteZeile].merkline;
- ⓪*WHILE (i < LinesOnScreen) & (Help^.naechste # NIL) DO
- ⓪,INC (i); Help := Help^.naechste; (* unterste Zeile suchen *)
- ⓪,INC (zeile);
- ⓪*END (* WHILE *);
- ⓪*GotoXY (0, i + 1);
- ⓪*MakeHighLine (Puff, (*ControlZeichen IN Modus, TabFiltern IN Modus,*)
- ⓪8zeile, Help^.ZeilPointer^);
- ⓪
- ⓪(ELSE j := z;
- ⓪(END (* IF *);
- ⓪(INC (j);
- ⓪&END (* WITH ErsteZeile *);
- ⓪$END (* WHILE *);
- ⓪$CursorEin;
- ⓪
- ⓪$(* Laufende Zeile oberhalb Fenster? *)
- ⓪$WHILE (MerkPunkte [LaufendeZeile].zeilpos < MerkPunkte [ErsteZeile].zeilpos + 1) DO
- ⓪&INC (MerkPunkte [LaufendeZeile].zeilpos);
- ⓪&MerkPunkte [LaufendeZeile].merkline := MerkPunkte [LaufendeZeile].merkline^.naechste;
- ⓪$END (* WHILE *);
- ⓪"END (* WITH *);
- ⓪ END ScrollUp;
- ⓪
- ⓪ PROCEDURE ScrollDown (Puff: einPufferPointer; z: CARDINAL);
- ⓪ VAR (*$Reg*)i, (*$Reg*)j: CARDINAL;
- ⓪((*$Reg*)zeile: CARDINAL;
- ⓪((*$Reg*)Help: einLinePointer;
- ⓪ BEGIN
- ⓪"WITH Puff^ DO
- ⓪$CursorAus;
- ⓪$zeile := MerkPunkte [ErsteZeile].zeilpos + 1;
- ⓪$j := 1;
- ⓪$WHILE j <= z DO
- ⓪&WITH MerkPunkte [ErsteZeile] DO
- ⓪(IF merkline^.vorige # Puffer THEN
- ⓪*InsertZeile (Puff, zeilpos + 1);
- ⓪;(* oben Zeile einfuegen *)
- ⓪;(* Achtung: InsertZeile subtrahiert den
- ⓪>Offset global y *)
- ⓪*merkline := merkline^.vorige;
- ⓪*DEC (zeilpos); (* Offset erniedrigen *)
- ⓪*DEC (zeile);
- ⓪(ELSE
- ⓪*j := z;
- ⓪(END (* IF *);
- ⓪&END;
- ⓪&
- ⓪&(* oberste Zeile neu schreiben: *)
- ⓪&GotoXY (0, 1);
- ⓪&MakeHighLine (Puff, (*ControlZeichen IN Modus, TabFiltern IN Modus,*)
- ⓪4zeile, MerkPunkte [ErsteZeile].merkline^.ZeilPointer^);
- ⓪&INC (j);
- ⓪$END (* WHILE *);
- ⓪$CursorEin;
- ⓪
- ⓪$(* Laufende Zeile unterhalb Fenster? *)
- ⓪$WHILE (MerkPunkte [LaufendeZeile].zeilpos >
- ⓪+MerkPunkte [ErsteZeile].zeilpos + LinesOnScreen) DO
- ⓪&DEC (MerkPunkte [LaufendeZeile].zeilpos);
- ⓪&MerkPunkte [LaufendeZeile].merkline :=
- ⓪(MerkPunkte [LaufendeZeile].merkline^.vorige;
- ⓪$END (* WHILE *);
- ⓪"END (* WITH *);
- ⓪ END ScrollDown;
- ⓪
- ⓪ PROCEDURE InsertLine (Puff: einPufferPointer;
- ⓪6REF z: ARRAY OF CHAR;
- ⓪6Indent: BOOLEAN;
- ⓪6zeigen: BOOLEAN;
- ⓪6adjustMerkpunkte: BOOLEAN);
- ⓪ VAR Help: einLinePointer;
- ⓪*stopx, i: CARDINAL;
- ⓪*Zlaenge, IndentLaenge: CARDINAL;
- ⓪*(* Verwendet globales x bei Auto-Indent *)
- ⓪*merkIndex: MerkIndex;
- ⓪*MerkPointer: einMerkPointer;
- ⓪
- ⓪ (* Haengt an die laufende Zeile eine Zeile mit Inhalt z an *)
- ⓪ BEGIN (* InsertLine *)
- ⓪"WITH Puff^ DO
- ⓪$Help := MerkPunkte [LaufendeZeile].merkline; (* Wir merken die alte Zeile *)
- ⓪$Zlaenge := LENGTH (z) + 1;
- ⓪$IF Indent THEN
- ⓪&WITH MerkPunkte [LaufendeZeile] DO
- ⓪(stopx := charpos;
- ⓪(charpos := 0; (* Vorbereitung fuer automatisch einruecken: *)
- ⓪(WITH Help^ DO
- ⓪*WHILE ((Zlaenge + charpos < cZeile) &
- ⓪1(* (Help^.ZeilPointer^ [charpos] IN CharSet {' ', tab}) & *)
- ⓪1((ZeilPointer^ [charpos] = ' ') OR
- ⓪2(ZeilPointer^ [charpos] = tab)) &
- ⓪1(charpos < stopx)) DO
- ⓪,INC (charpos); (* Cursorposition erhoehen *)
- ⓪*END (* WHILE *);
- ⓪(END (* WITH *);
- ⓪(IndentLaenge := charpos; (* Das ist der Index, bis zu dem Einrueck-
- ⓪Dzeichen wie Blank oder Tab kopiert werden *)
- ⓪&END (* WITH *);
- ⓪$ELSE IndentLaenge := 0;
- ⓪$END (* IF Indent *);
- ⓪$DEC (Zlaenge);
- ⓪$(* Zlaenge ist die Laenge von z *)
- ⓪$(* IndentLaenge ist die Laenge der Einrückung *)
- ⓪
- ⓪$AllocLine (MerkPunkte [LaufendeZeile].merkline, Zlaenge + IndentLaenge);
- ⓪$(* Wir haben eine neue Zeile erzeugt *)
- ⓪$IF MerkPunkte [LaufendeZeile].merkline # NIL THEN
- ⓪&(* PutLine (MerkPunkte [LaufendeZeile].merkline, Zeile); *)
- ⓪&WITH MerkPunkte [LaufendeZeile].merkline^ DO
- ⓪(IF IndentLaenge > 0 THEN
- ⓪*FOR i := 0 TO IndentLaenge - 1 DO
- ⓪,ZeilPointer^[i] := Help^.ZeilPointer^ [i]; (* Kopieren der Einrueckzeichen *)
- ⓪*END (* FOR *);
- ⓪(END (* IF *);
- ⓪(IF Zlaenge > 0 THEN
- ⓪*FOR i := 0 TO Zlaenge - 1 DO
- ⓪,ZeilPointer^[IndentLaenge] := z [i]; INC (IndentLaenge); (* Index auf Gesamtlaenge *)
- ⓪,(* Kopieren der Zeichen in der Zeile, die eingefügt wird *)
- ⓪*END;
- ⓪(END (* IF *);
- ⓪(ZeilPointer^[IndentLaenge] := nul;
- ⓪(
- ⓪(vorige := Help; (* Die alte Zeile wird Vorgaenger *)
- ⓪(naechste := Help^.naechste; (* alte naechste unten anhaengen *)
- ⓪&END (* WITH LaufendeZeile *);
- ⓪&IF Help^.naechste # NIL
- ⓪(THEN Help^.naechste^.vorige := MerkPunkte [LaufendeZeile].merkline;
- ⓪&END (* IF *);
- ⓪&Help^.naechste := MerkPunkte [LaufendeZeile].merkline; (* neue Zeile eingehaengt *)
- ⓪&INC (MerkPunkte [LaufendeZeile].zeilpos);
- ⓪&INC (ZeilenAnzahl); (* Zeilenzaehler erhoehen *)
- ⓪
- ⓪&IF adjustMerkpunkte THEN
- ⓪(FOR merkIndex := MerkPunkt1 TO LetztePosition DO
- ⓪*WITH MerkPunkte [merkIndex] DO
- ⓪,IF MerkPunkte [LaufendeZeile].zeilpos <= zeilpos THEN INC (zeilpos);
- ⓪,END;
- ⓪*END (* WITH *);
- ⓪(END (* FOR *);
- ⓪&END (* IF adjustMerkpunkte *);
- ⓪&IF zeigen THEN
- ⓪(IF (MerkPunkte [LaufendeZeile].zeilpos - MerkPunkte [ErsteZeile].zeilpos
- ⓪,> LinesOnScreen) THEN
- ⓪*ScrollUp (Puff, 1);
- ⓪(END (* IF *);
- ⓪(InsertZeile (Puff, MerkPunkte [LaufendeZeile].zeilpos);
- ⓪(WriteString (MerkPunkte [ErsteZeile].charpos,
- ⓪5(*ControlZeichen IN Modus, TabFiltern IN Modus,*)
- ⓪5MerkPunkte [LaufendeZeile].merkline^.ZeilPointer^);
- ⓪&END (* IF *);
- ⓪$ELSE MerkPunkte [LaufendeZeile].merkline := Help;
- ⓪$END (* IF neue Zeile *);
- ⓪"END (* WITH *);
- ⓪ END InsertLine;
- ⓪
- ⓪ PROCEDURE DeleteLine (Puff: einPufferPointer;
- ⓪6VAR LoeschZeile: einLinePointer;
- ⓪6zeigen, puffern: BOOLEAN);
- ⓪ VAR Help: einLinePointer;
- ⓪*i, zeile: CARDINAL;
- ⓪*merkIndex: MerkIndex;
- ⓪*MerkPointer: einMerkPointer;
- ⓪*LoeschPos: CARDINAL;
- ⓪*l: CARDINAL;
- ⓪*PufZeile: eineZeile;
- ⓪*LeerString: ARRAY [0..0] OF CHAR;
- ⓪
- ⓪"(* ACHTUNG: WARNUNG: DeleteLine l ö s c h t N I C H T die LaufendeZeile,
- ⓪%sondern die durch LoeschZeile bezeichnete Zeile!!!!!!!!!!!!!
- ⓪%>>zeigen<< funktioniert nicht korrekt, wenn LoeschZeile nicht mit
- ⓪%LaufenderZeile identisch!!!
- ⓪"*)
- ⓪!
- ⓪ BEGIN (* DeleteLine *)
- ⓪"LeerString := '';
- ⓪"WITH Puff^ DO
- ⓪$IF Puffer^.naechste^.naechste = NIL THEN
- ⓪$(* Sonderfall: Es gibt nur eine Zeile, diese darf nicht verschwinden.
- ⓪'Daher wird eine Ersatzzeile eingefügt. Diese wird jedoch
- ⓪'die zweite Zeile (die weiter unten dann hochgezogen wird) *)
- ⓪&InsertLine (Puff, LeerString, FALSE, zeigen, FALSE);
- ⓪$(* Rückstellung auf die ursprüngliche Zeile: *)
- ⓪&LineUp (Puff);
- ⓪$END (* IF nur eine Zeile vorhanden *);
- ⓪"
- ⓪$SucheZeilenNummer (Puff, LoeschZeile, LoeschPos);
- ⓪$(* Pruefen und ggf. Updaten der Merker: *)
- ⓪$FOR merkIndex := MerkPunkt1 TO LetztePosition DO
- ⓪&WITH MerkPunkte [merkIndex] DO
- ⓪(IF LoeschPos < zeilpos THEN DEC (zeilpos);
- ⓪(ELSIF (LoeschPos = zeilpos) &
- ⓪.(LoeschZeile^.naechste # NIL) THEN
- ⓪*merkline := LoeschZeile^.naechste;
- ⓪*l := LENGTH (merkline^.ZeilPointer^);
- ⓪*IF charpos > l THEN
- ⓪,charpos := l;
- ⓪*END (* IF *);
- ⓪(ELSIF LoeschPos = zeilpos THEN
- ⓪*merkline := LoeschZeile^.vorige;
- ⓪*l := LENGTH (merkline^.ZeilPointer^);
- ⓪*IF charpos > l THEN
- ⓪,charpos := l;
- ⓪*END (* IF *);
- ⓪(END (* IF *);
- ⓪&END (* WITH *);
- ⓪$END (* FOR merkindex *);
- ⓪$
- ⓪$(* Zeileninhalt merken: *)
- ⓪$IF puffern THEN
- ⓪&GetLine (LoeschZeile, PufZeile);
- ⓪&IF (UndoPuffer^.Puffer^.naechste^.naechste = NIL) &
- ⓪)(UndoPuffer^.Puffer^.naechste^.ZeilPointer^[0] = nul) THEN
- ⓪(PutLine (UndoPuffer^.Puffer^.naechste, PufZeile);
- ⓪&ELSE InsertLine (UndoPuffer, PufZeile, FALSE, FALSE, TRUE);
- ⓪&END (* IF Undopuffer leer *);
- ⓪$END (* IF puffern *);
- ⓪$Help := LoeschZeile^.vorige; (* Vorige Zeile gemerkt *)
- ⓪@(* Achtung: Kann Puffer sein *)
- ⓪$IF LoeschZeile^.naechste # NIL THEN
- ⓪&Help^.naechste := LoeschZeile^.naechste;
- ⓪&LoeschZeile^.naechste^.vorige := Help;
- ⓪((* Laufende Zeile ausgehaengt *)
- ⓪&IF MerkPunkte [ErsteZeile].merkline = LoeschZeile THEN
- ⓪(MerkPunkte [ErsteZeile].merkline := LoeschZeile^.naechste;
- ⓪&END (* IF *);
- ⓪&DeAllocLine (LoeschZeile);
- ⓪3(* Laufende Zeile geloescht *)
- ⓪&IF zeigen THEN DeleteZeile (Puff, MerkPunkte [LaufendeZeile].zeilpos);
- ⓪2(* Zeile auf Bildschirm geloescht *)
- ⓪&END (* IF *);
- ⓪&LoeschZeile := Help^.naechste;
- ⓪&IF zeigen THEN
- ⓪(i := 1; Help := MerkPunkte [ErsteZeile].merkline;
- ⓪(zeile := MerkPunkte [ErsteZeile].zeilpos + 1;
- ⓪((* Unterste Zeile neu schreiben *)
- ⓪(WHILE (i < LinesOnScreen) & (Help^.naechste # NIL) DO
- ⓪*INC (i); Help := Help^.naechste; INC (zeile);
- ⓪(END (* WHILE *);
- ⓪(CursorAus; GotoXY (0, i);
- ⓪(MakeHighLine (Puff, (*ControlZeichen IN Modus, TabFiltern IN Modus,*)
- ⓪6zeile, Help^.ZeilPointer^);
- ⓪&END (* IF zeigen *);
- ⓪&DEC (ZeilenAnzahl);
- ⓪$ELSE (* Wir stehen in der letzten Zeile *)
- ⓪&IF zeigen THEN
- ⓪(GotoXY (0, MerkPunkte [LaufendeZeile].zeilpos -
- ⓪3MerkPunkte [ErsteZeile].zeilpos);
- ⓪(LoescheZeile;
- ⓪&END (* IF zeigen *);
- ⓪&
- ⓪&GetLine (LoeschZeile, PufZeile);
- ⓪&PufZeile [0] := CHR (0);
- ⓪&PutLine (LoeschZeile, PufZeile);
- ⓪$END (* IF letzte Zeile *);
- ⓪"END (* WITH *);
- ⓪ END DeleteLine;
- ⓪
- ⓪ PROCEDURE LineUp (Puff: einPufferPointer);
- ⓪ BEGIN
- ⓪"WITH Puff^ DO
- ⓪$WITH MerkPunkte [LaufendeZeile] DO
- ⓪&IF merkline^.vorige # Puffer THEN
- ⓪(merkline :=
- ⓪*merkline^.vorige;
- ⓪(DEC (zeilpos);
- ⓪(IF MerkPunkte [ErsteZeile].zeilpos + 1 > zeilpos THEN
- ⓪*ScrollDown (Puff, 1);
- ⓪(END (* IF *);
- ⓪&END (* IF *);
- ⓪$END (* WITH *);
- ⓪"END (* WITH *);
- ⓪ END LineUp;
- ⓪
- ⓪ PROCEDURE LineDown (Puff: einPufferPointer);
- ⓪ BEGIN
- ⓪"WITH Puff^ DO
- ⓪$WITH MerkPunkte [LaufendeZeile] DO
- ⓪&IF merkline^.naechste # NIL THEN
- ⓪(merkline := merkline^.naechste;
- ⓪(INC (zeilpos);
- ⓪(IF zeilpos - MerkPunkte [ErsteZeile].zeilpos > LinesOnScreen THEN
- ⓪*ScrollUp (Puff, 1);
- ⓪(END (* IF *);
- ⓪&END (* IF *);
- ⓪$END (* WITH *);
- ⓪"END (* WITH *);
- ⓪ END LineDown;
- ⓪
- ⓪ PROCEDURE SucheZeilenPointer (Puff: einPufferPointer;
- ⓪>VAR Nummer: CARDINAL;
- ⓪>VAR Zeile: einLinePointer);
- ⓪ VAR (*$Reg*) n, (*$Reg*) nummer: CARDINAL;
- ⓪((*$Reg*) zl: einLinePointer;
- ⓪ BEGIN
- ⓪"nummer:= Nummer;
- ⓪"WITH Puff^ DO
- ⓪$zl:= Puffer^.naechste;
- ⓪$n := 1;
- ⓪$WHILE (zl^.naechste # NIL) & (n < nummer) DO
- ⓪&zl:= zl^.naechste;
- ⓪&INC (n);
- ⓪$END (* WHILE *);
- ⓪"END (* WITH *);
- ⓪"Zeile:= zl;
- ⓪"Nummer := n;
- ⓪ END SucheZeilenPointer;
- ⓪
- ⓪ PROCEDURE StellePointerEin (Puff: einPufferPointer;
- ⓪@l: einLinePointer;
- ⓪@offset: CARDINAL);
- ⓪ BEGIN
- ⓪"IF offset > LinesOnScreen THEN offset := LinesOnScreen; END;
- ⓪"WITH Puff^ DO
- ⓪$SucheZeilenNummer (Puff, l, MerkPunkte [LaufendeZeile].zeilpos);
- ⓪$MerkPunkte [LaufendeZeile].merkline := l; (* Tatsaechlich gef. Zeilenpointer *)
- ⓪$MerkPunkte [ErsteZeile].merkline := MerkPunkte [LaufendeZeile].merkline;
- ⓪$MerkPunkte [ErsteZeile].zeilpos := MerkPunkte [LaufendeZeile].zeilpos - 1;
- ⓪$WHILE (MerkPunkte [ErsteZeile].merkline^.vorige # Puffer) &
- ⓪*((MerkPunkte [ErsteZeile].zeilpos + offset) >
- ⓪,MerkPunkte [LaufendeZeile].zeilpos) DO
- ⓪&MerkPunkte [ErsteZeile].merkline :=
- ⓪(MerkPunkte [ErsteZeile].merkline^.vorige;
- ⓪&DEC (MerkPunkte [ErsteZeile].zeilpos);
- ⓪$END (* WHILE *);
- ⓪"END (* WITH *);
- ⓪ END StellePointerEin;
- ⓪
- ⓪ PROCEDURE StelleZeileEin (Puff: einPufferPointer;
- ⓪6n, offset: CARDINAL);
- ⓪ BEGIN
- ⓪"IF offset > LinesOnScreen THEN offset := LinesOnScreen; END;
- ⓪"WITH Puff^ DO
- ⓪$SucheZeilenPointer (Puff, n, MerkPunkte [LaufendeZeile].merkline);
- ⓪$MerkPunkte [LaufendeZeile].zeilpos := n; (* Tatsaechlich gef. Zeilennummer *)
- ⓪$MerkPunkte [ErsteZeile].merkline := MerkPunkte [LaufendeZeile].merkline;
- ⓪$MerkPunkte [ErsteZeile].zeilpos := MerkPunkte [LaufendeZeile].zeilpos - 1;
- ⓪$WHILE (MerkPunkte [ErsteZeile].merkline^.vorige # Puffer) &
- ⓪*((MerkPunkte [ErsteZeile].zeilpos + offset) >
- ⓪,MerkPunkte [LaufendeZeile].zeilpos) DO
- ⓪&MerkPunkte [ErsteZeile].merkline :=
- ⓪(MerkPunkte [ErsteZeile].merkline^.vorige;
- ⓪&DEC (MerkPunkte [ErsteZeile].zeilpos);
- ⓪$END (* WHILE *);
- ⓪"END (* WITH *);
- ⓪ END StelleZeileEin;
- ⓪
- ⓪ PROCEDURE SucheZeilenNummer (Puff: einPufferPointer;
- ⓪=Zeile: einLinePointer;
- ⓪=VAR Nummer: CARDINAL);
- ⓪"(* Nummer der Zeile mit Zeiger Zeile ermitteln *)
- ⓪ VAR z: einLinePointer;
- ⓪ BEGIN
- ⓪"z := Puff^.Puffer^.naechste;
- ⓪"Nummer := 1;
- ⓪"WHILE (z^.naechste # NIL) & (z # Zeile) DO
- ⓪$z := z^.naechste; INC (Nummer);
- ⓪"END (* WHILE *);
- ⓪"IF z # Zeile THEN Nummer := 1; END;
- ⓪ END SucheZeilenNummer;
- ⓪
- ⓪ (* Ende von EditKernel *)
- ⓪
- ⓪ (******************************* EditUtil *******************************)
- ⓪
- ⓪ (* Diese Konstante soll ein Parameter CharSet werden - am besten
- ⓪#als Bestandteil des PufferDeskriptors: TrennSet: CharSet; *)
- ⓪ CONST TrennSet = CharSet {0C..' ', '!', '"', '%', '/', '&',
- ⓪*'(', ')', '=', '?', "'", '`', '#', '^', '@', '\', '+', '*',
- ⓪*'[', ']', '{', '}', '<', '>', ',', ';', '.', ':', '-', '_',
- ⓪*'~', '|', '»', '«'};
- ⓪
- ⓪ PROCEDURE GetKey (zeile: CARDINAL;
- ⓪2info: ARRAY OF CHAR;
- ⓪2set: CharSet;
- ⓪2VAR ch: CHAR);
- ⓪ VAR cch: CHAR;
- ⓪ BEGIN
- ⓪"GotoXY (0, zeile);
- ⓪"LoescheZeile; HighLight; WriteConst (info); Normal;
- ⓪"REPEAT
- ⓪$LiesZeichen (cch);
- ⓪$IF cch # nul THEN ch := CAP (cch); END;
- ⓪"UNTIL ch IN set;
- ⓪"WriteChar (ch);
- ⓪ END GetKey;
- ⓪
- ⓪ PROCEDURE ReadNum (zeile: CARDINAL; REF info: ARRAY OF CHAR; VAR n: CARDINAL);
- ⓪ VAR s: eineInfo;
- ⓪(ok: BOOLEAN;
- ⓪(m: CARDINAL;
- ⓪(d: einTasteneintrag;
- ⓪(pos: CARDINAL;
- ⓪ BEGIN
- ⓪"ConvCard (n, 1, s);
- ⓪"Prompt (zeile, info, s, d); (* Wieso: Typ muß identisch mit VAR-Parameter sein??? *)
- ⓪"IF s [0] # CHR (0) THEN
- ⓪$(* ok := StrToCard (s, m); *)
- ⓪$pos := 0; (* ???? *)
- ⓪$m := StrToCard (s, pos, ok);
- ⓪$IF ok THEN n := m; END;
- ⓪"END (* IF *);
- ⓪ END ReadNum;
- ⓪
- ⓪ PROCEDURE LoeschePuffer (p: einPufferPointer);
- ⓪ BEGIN
- ⓪"IF (Editiert IN p^.Modus) THEN
- ⓪$SchirmSchreiben (p, p^.MerkPunkte [ErsteZeile].merkline, 0, 0);
- ⓪$IF FrageJaNein (Nein, 'Editierten Puffer löschen?') THEN
- ⓪&Loeschen (p);
- ⓪$END (* IF *);
- ⓪"ELSE Loeschen (p);
- ⓪"END (* IF *);
- ⓪ END LoeschePuffer;
- ⓪
- ⓪ PROCEDURE KopiereAusKlemmbrett (Puff: einPufferPointer;
- ⓪@ClipBoard: einPufferPointer);
- ⓪ VAR Start: einLinePointer;
- ⓪&z, zz: eineZeile;
- ⓪&x, returnX, i: CARDINAL;
- ⓪ BEGIN
- ⓪"MausBusy;
- ⓪"INCL (Puff^.Modus, Editiert);
- ⓪"Start := ClipBoard^.Puffer^.naechste;
- ⓪"IF (Start^.naechste # NIL) (* mehr als eine Zeile insertieren *)
- ⓪$(* Zeile nicht leer *) THEN
- ⓪$x := Puff^.MerkPunkte [LaufendeZeile].charpos;
- ⓪$DoCR (Puff, FALSE, returnX); (* laufende Zeile bei Cursor spalten *)
- ⓪$LineUp (Puff); Puff^.MerkPunkte [LaufendeZeile].charpos := x;
- ⓪"END (* IF *);
- ⓪"GetLine (Start, z); GetLine (Puff^.MerkPunkte [LaufendeZeile].merkline, zz);
- ⓪"IF LENGTH (z) + LENGTH (zz) <= cZeile THEN
- ⓪$WITH Puff^.MerkPunkte [LaufendeZeile] DO
- ⓪&IF charpos > LENGTH (zz) THEN
- ⓪(FOR i := LENGTH (zz) TO charpos - 1 DO
- ⓪*zz [i] := ' ';
- ⓪(END (* FOR *);
- ⓪(zz [charpos] := nul;
- ⓪&END (* IF *);
- ⓪$END (* WITH *);
- ⓪$Insert (z, Puff^.MerkPunkte [LaufendeZeile].charpos, zz);
- ⓪$PutLine (Puff^.MerkPunkte [LaufendeZeile].merkline, zz);
- ⓪"ELSE
- ⓪$LineUp (Puff);
- ⓪$InsertLine (Puff, Start^.ZeilPointer^, AutoIndent IN Puff^.Modus,
- ⓪0FALSE, TRUE);
- ⓪"END (* IF *);
- ⓪"Start := Start^.naechste;
- ⓪"IF Start = NIL THEN RETURN; END;
- ⓪!
- ⓪"WHILE Start^.naechste # NIL DO
- ⓪$InsertLine (Puff, Start^.ZeilPointer^, AutoIndent IN Puff^.Modus,
- ⓪0FALSE, TRUE);
- ⓪$Start := Start^.naechste;
- ⓪"END (* WHILE *);
- ⓪!
- ⓪"(* Die letzte Zeile wird wieder - an den Anfang der laufenden -
- ⓪%insertiert: *)
- ⓪"LineDown (Puff);
- ⓪"GetLine (Start, z); GetLine (Puff^.MerkPunkte [LaufendeZeile].merkline, zz);
- ⓪"IF LENGTH (z) + LENGTH (zz) <= cZeile THEN
- ⓪$Insert (z, 0, zz);
- ⓪$Puff^.MerkPunkte [LaufendeZeile].charpos := LENGTH (z);
- ⓪$PutLine (Puff^.MerkPunkte [LaufendeZeile].merkline, zz);
- ⓪"ELSE
- ⓪$LineUp (Puff);
- ⓪$InsertLine (Puff, Start^.ZeilPointer^, AutoIndent IN Puff^.Modus,
- ⓪0FALSE, TRUE);
- ⓪"END (* IF *);
- ⓪"ClipBoard^.MerkPunkte [LaufendeZeile].merkline := Start;
- ⓪"(* Wegen Blockmarken-Adjust! *)
- ⓪ END KopiereAusKlemmbrett;
- ⓪
- ⓪ PROCEDURE Kopiere (Puff: einPufferPointer; ClipBoard: einPufferPointer);
- ⓪ BEGIN
- ⓪"MausBusy;
- ⓪"WITH Puff^ DO
- ⓪$WITH MerkPunkte [BlockMarke1] DO
- ⓪&zeilpos := MerkPunkte [LaufendeZeile].zeilpos;
- ⓪&merkline := MerkPunkte [LaufendeZeile].merkline;
- ⓪&charpos := MerkPunkte [LaufendeZeile].charpos;
- ⓪$END (* WITH *);
- ⓪$KopiereAusKlemmbrett (Puff, ClipBoard);
- ⓪$WITH MerkPunkte [BlockMarke2] DO
- ⓪&zeilpos := MerkPunkte [LaufendeZeile].zeilpos;
- ⓪&merkline := MerkPunkte [LaufendeZeile].merkline;
- ⓪&(* charpos := MerkPunkte [LaufendeZeile].charpos; *)
- ⓪&IF ClipBoard^.Puffer^.naechste^.naechste # NIL THEN
- ⓪(charpos :=
- ⓪(LENGTH (ClipBoard^.MerkPunkte [LaufendeZeile].merkline^.ZeilPointer^);
- ⓪&ELSE
- ⓪(charpos := MerkPunkte [BlockMarke1].charpos
- ⓪*+ LENGTH (ClipBoard^.MerkPunkte [LaufendeZeile].merkline^.ZeilPointer^);
- ⓪&END (* IF *);
- ⓪&MerkPunkte [LaufendeZeile].charpos := charpos;
- ⓪$END (* WITH *);
- ⓪$StelleZeileEin (Puff, Puff^.MerkPunkte [BlockMarke2].zeilpos,
- ⓪4LinesOnScreen -3);
- ⓪$SchirmSchreiben (Puff, MerkPunkte [LaufendeZeile].merkline, 0, 0);
- ⓪"END (* WITH Puff *);
- ⓪ END Kopiere;
- ⓪
- ⓪
- ⓪ PROCEDURE LoescheBlockMarke1 (Puff: einPufferPointer);
- ⓪ BEGIN
- ⓪"WITH Puff^.MerkPunkte [BlockMarke1] DO
- ⓪$zeilpos := 0;
- ⓪$charpos := 0;
- ⓪$merkline := NIL;
- ⓪"END (* WITH *);
- ⓪ END LoescheBlockMarke1;
- ⓪
- ⓪ PROCEDURE LoescheBlockMarke2 (Puff: einPufferPointer);
- ⓪ BEGIN
- ⓪"WITH Puff^.MerkPunkte [BlockMarke2] DO
- ⓪$zeilpos := 0;
- ⓪$charpos := 0;
- ⓪$merkline := NIL;
- ⓪"END (* WITH *);
- ⓪ END LoescheBlockMarke2;
- ⓪
- ⓪ PROCEDURE LoescheBlockMarken (Puff: einPufferPointer);
- ⓪ BEGIN
- ⓪"LoescheBlockMarke1 (Puff);
- ⓪"LoescheBlockMarke2 (Puff);
- ⓪ END LoescheBlockMarken;
- ⓪
- ⓪ PROCEDURE Gueltig (Puff: einPufferPointer; marke: MerkIndex): BOOLEAN;
- ⓪"BEGIN
- ⓪$RETURN Puff^.MerkPunkte [marke].zeilpos > 0;
- ⓪"END Gueltig;
- ⓪
- ⓪ PROCEDURE Vor (Puff: einPufferPointer; one, two: MerkIndex): BOOLEAN;
- ⓪"VAR zeil1, zeil2: CARDINAL;
- ⓪"BEGIN
- ⓪#WITH Puff^ DO
- ⓪%zeil1:= MerkPunkte [one].zeilpos;
- ⓪%zeil2:= MerkPunkte [two].zeilpos;
- ⓪%RETURN (zeil1 < zeil2)
- ⓪'OR (zeil1 = zeil2) AND
- ⓪)(MerkPunkte [one].charpos < MerkPunkte [two].charpos)
- ⓪$END
- ⓪"END Vor;
- ⓪
- ⓪ PROCEDURE BlockMarkiert (Puff: einPufferPointer): BOOLEAN;
- ⓪"(* Liefert TRUE, wenn ein gültiger Block im Puffer markiert ist *)
- ⓪"(* Das ist der Fall, wenn Marke2 hinter Marke1 liegt *)
- ⓪"BEGIN
- ⓪$RETURN Gueltig (Puff, BlockMarke1) & Vor (Puff, BlockMarke1, BlockMarke2)
- ⓪"END BlockMarkiert;
- ⓪
- ⓪ PROCEDURE VorBlockMarke1 (Puff: einPufferPointer): BOOLEAN;
- ⓪"BEGIN
- ⓪$RETURN Vor (Puff, LaufendeZeile, BlockMarke1)
- ⓪"END VorBlockMarke1;
- ⓪
- ⓪ PROCEDURE HinterBlockMarke2 (Puff: einPufferPointer): BOOLEAN;
- ⓪"BEGIN
- ⓪$RETURN Gueltig (Puff, BlockMarke2) & Vor (Puff, BlockMarke2, LaufendeZeile)
- ⓪"END HinterBlockMarke2;
- ⓪
- ⓪ PROCEDURE InBlockMarken (Puff: einPufferPointer): BOOLEAN;
- ⓪"BEGIN
- ⓪$RETURN BlockMarkiert (Puff) &
- ⓪'NOT VorBlockMarke1 (Puff) &
- ⓪'NOT HinterBlockMarke2 (Puff)
- ⓪"END InBlockMarken;
- ⓪
- ⓪ PROCEDURE SetCharposToEndOfLine (Puff: einPufferPointer; index: MerkIndex);
- ⓪"BEGIN
- ⓪$WITH Puff^.MerkPunkte [index] DO
- ⓪&IF charpos > LENGTH (merkline^.ZeilPointer^) THEN
- ⓪(charpos := LENGTH (merkline^.ZeilPointer^)
- ⓪&END;
- ⓪$END;
- ⓪"END SetCharposToEndOfLine;
- ⓪
- ⓪ PROCEDURE MarkiereBlockAnfang (Puff: einPufferPointer);
- ⓪ VAR merkZeile2, merkZeile1, dummyC: CARDINAL;
- ⓪(merkLine1: einLinePointer;
- ⓪ BEGIN
- ⓪"MausBusy;
- ⓪"SetCharposToEndOfLine (Puff, LaufendeZeile);
- ⓪"WITH Puff^ DO
- ⓪$(* altes Blockende merken *)
- ⓪$merkZeile2 := MerkPunkte [BlockMarke2].zeilpos;
- ⓪$WITH MerkPunkte [BlockMarke1] DO
- ⓪&IF (zeilpos = 0) OR (MerkPunkte [LaufendeZeile].zeilpos < zeilpos) THEN
- ⓪((* Laufende Zeile vor alter Marke *)
- ⓪(merkZeile1 := MerkPunkte [LaufendeZeile].zeilpos;
- ⓪&ELSE
- ⓪(merkZeile1 := zeilpos;
- ⓪&END;
- ⓪&zeilpos := MerkPunkte [LaufendeZeile].zeilpos;
- ⓪&merkline := MerkPunkte [LaufendeZeile].merkline;
- ⓪&charpos := MerkPunkte [LaufendeZeile].charpos;
- ⓪$END (* WITH *);
- ⓪$
- ⓪$SucheZeilenPointer (Puff, merkZeile1, merkLine1);
- ⓪$(*
- ⓪$StelleZeileEin (Puff, MerkPunkte [BlockMarke1].zeilpos,
- ⓪'MerkPunkte [BlockMarke1].zeilpos - MerkPunkte [ErsteZeile].zeilpos);
- ⓪$*)
- ⓪$IF NOT BlockMarkiert (Puff) THEN
- ⓪&(* ANDERE Marke löschen *)
- ⓪&LoescheBlockMarke2 (Puff);
- ⓪$END (* IF *);
- ⓪$IF merkZeile2 > 0 THEN
- ⓪&SchirmSchreiben (Puff, merkLine1, merkZeile2 - merkZeile1 + 1, 0);
- ⓪$END
- ⓪"END (* WITH *);
- ⓪ END MarkiereBlockAnfang;
- ⓪
- ⓪ PROCEDURE MarkiereBlockEnde (Puff: einPufferPointer);
- ⓪ VAR merkZeile1, merkZeile2, dummyC: CARDINAL;
- ⓪(merkLine1: einLinePointer;
- ⓪ BEGIN
- ⓪"MausBusy;
- ⓪"SetCharposToEndOfLine (Puff, LaufendeZeile);
- ⓪"WITH Puff^ DO
- ⓪$(* alten Blockanfang merken *)
- ⓪$merkZeile1 := MerkPunkte [BlockMarke1].zeilpos;
- ⓪$merkLine1 := MerkPunkte [BlockMarke1].merkline;
- ⓪$WITH MerkPunkte [BlockMarke2] DO
- ⓪&IF (MerkPunkte [LaufendeZeile].zeilpos > zeilpos) THEN
- ⓪((* neue Endmarke hinter bisherige Endmarke setzen *)
- ⓪(merkZeile2 := MerkPunkte [LaufendeZeile].zeilpos;
- ⓪&ELSE
- ⓪(merkZeile2 := zeilpos;
- ⓪&END (* IF - was ist groesser *);
- ⓪&zeilpos := MerkPunkte [LaufendeZeile].zeilpos;
- ⓪&merkline := MerkPunkte [LaufendeZeile].merkline;
- ⓪&charpos := MerkPunkte [LaufendeZeile].charpos;
- ⓪$END (* WITH *);
- ⓪$(*
- ⓪$StelleZeileEin (Puff, MerkPunkte [BlockMarke2].zeilpos,
- ⓪'MerkPunkte [BlockMarke2].zeilpos - MerkPunkte [ErsteZeile].zeilpos);
- ⓪$*)
- ⓪$IF NOT BlockMarkiert (Puff) THEN
- ⓪&(* ANDERE Marke löschen *)
- ⓪&LoescheBlockMarke1 (Puff);
- ⓪$END (* IF *);
- ⓪$IF merkZeile1 > 0 THEN
- ⓪&SchirmSchreiben (Puff, merkLine1, merkZeile2 - merkZeile1 + 1, 0);
- ⓪$END
- ⓪"END (* WITH *);
- ⓪ END MarkiereBlockEnde;
- ⓪
- ⓪ PROCEDURE KopiereLoesche (Puff, ClipBoard: einPufferPointer;
- ⓪:kopiere, loesche: BOOLEAN);
- ⓪ VAR Start, FolgeZeile: einLinePointer; (* auf die laufende Zeile *)
- ⓪&aktZeile, ii, ez, az, pos1, pos2: CARDINAL;
- ⓪&string, z: eineZeile;
- ⓪&firstLine: BOOLEAN;
- ⓪
- ⓪ BEGIN (* KopiereLoesche *)
- ⓪"IF kopiere & (ClipBoard^.Puffer = NIL) THEN
- ⓪$Nachricht ('Fehler: kein ClipBoard!'); RETURN;
- ⓪"END;
- ⓪"IF NOT BlockMarkiert (Puff) THEN
- ⓪$Nachricht ('Kein Block markiert!'); RETURN;
- ⓪"END;
- ⓪"MausBusy;
- ⓪"WITH Puff^ DO
- ⓪$az := MerkPunkte [BlockMarke1].zeilpos;
- ⓪$ez := MerkPunkte [BlockMarke2].zeilpos;
- ⓪$aktZeile := az;
- ⓪$Start := MerkPunkte [BlockMarke1].merkline;
- ⓪$
- ⓪$IF kopiere THEN Loeschen (ClipBoard) END;
- ⓪
- ⓪$firstLine:= TRUE;
- ⓪$pos1:= MerkPunkte [BlockMarke1].charpos;
- ⓪$LOOP
- ⓪&FolgeZeile := Start^.naechste;
- ⓪&IF firstLine OR (aktZeile = MerkPunkte [BlockMarke2].zeilpos) THEN
- ⓪((************ Zeile teilweise kopieren/löschen ************)
- ⓪(GetLine (Start, string);
- ⓪(IF aktZeile = MerkPunkte [BlockMarke2].zeilpos THEN
- ⓪*(* wir sind bei der letzten Zeile *)
- ⓪*pos2:= MerkPunkte [BlockMarke2].charpos
- ⓪(ELSE
- ⓪*pos2:= LENGTH (string)
- ⓪(END;
- ⓪(Copy (string, pos1, pos2 - pos1, z);
- ⓪(IF kopiere THEN
- ⓪*IF firstLine THEN
- ⓪,PutLine (ClipBoard^.MerkPunkte [LaufendeZeile].merkline, z)
- ⓪*ELSE
- ⓪,InsertLine (ClipBoard, z, FALSE, FALSE, TRUE)
- ⓪*END
- ⓪(END;
- ⓪(IF loesche THEN
- ⓪*INCL (Modus, Editiert);
- ⓪*Delete (string, pos1, pos2 - pos1);
- ⓪*PutLine (Start, string);
- ⓪*WITH MerkPunkte [LaufendeZeile] DO
- ⓪,zeilpos:= MerkPunkte [BlockMarke2].zeilpos;
- ⓪,charpos:= MerkPunkte [BlockMarke2].charpos;
- ⓪,merkline:= MerkPunkte [BlockMarke2].merkline
- ⓪*END;
- ⓪*IF NOT firstLine THEN
- ⓪,DoBackspace (Puff)
- ⓪*END
- ⓪(END;
- ⓪(IF aktZeile = MerkPunkte [BlockMarke2].zeilpos THEN
- ⓪*(* das war die letzte Zeile -> Fertig *)
- ⓪*EXIT
- ⓪(END;
- ⓪(INC (aktZeile);
- ⓪&ELSE
- ⓪((************ gesamte Zeile kopieren/löschen ************)
- ⓪(IF kopiere THEN
- ⓪*InsertLine (ClipBoard, Start^.ZeilPointer^, FALSE, FALSE, TRUE);
- ⓪(END;
- ⓪(IF loesche THEN
- ⓪*DeleteLine (Puff, Start, FALSE, FALSE);
- ⓪(ELSE
- ⓪*INC (aktZeile);
- ⓪(END;
- ⓪&END;
- ⓪&Start := FolgeZeile;
- ⓪&IF Start = NIL THEN
- ⓪((* Textende *)
- ⓪(EXIT
- ⓪&END;
- ⓪&firstLine:= FALSE;
- ⓪&pos1:= 0;
- ⓪$END;
- ⓪$IF loesche THEN
- ⓪&(* Cursor auf gelöschte Stelle setzen *)
- ⓪&WITH MerkPunkte [LaufendeZeile] DO
- ⓪(SucheZeilenPointer (Puff, az, merkline);
- ⓪(zeilpos := az;
- ⓪(charpos:= MerkPunkte [BlockMarke1].charpos;
- ⓪&END;
- ⓪&(* Screen neu zeichnen *)
- ⓪&LoescheBlockMarken (Puff);
- ⓪&SchirmSchreiben (Puff, MerkPunkte [LaufendeZeile].merkline, 0, 0);
- ⓪$END;
- ⓪"END
- ⓪ END KopiereLoesche;
- ⓪
- ⓪ PROCEDURE RueckeBlockEin (Puff: einPufferPointer);
- ⓪ VAR bef: einTasteneintrag;
- ⓪(index, i, t: CARDINAL;
- ⓪(x, y: CARDINAL;
- ⓪(bewegt, Doit, Schirm: BOOLEAN;
- ⓪(Knoepfe: ButtonSet;
- ⓪(blank: ARRAY [0..80] OF CHAR;
- ⓪
- ⓪"PROCEDURE Ruecke (links: BOOLEAN);
- ⓪"VAR Zeile: einLinePointer;
- ⓪(Zeilstr: ARRAY [0..cZeile] OF CHAR;
- ⓪(l: CARDINAL;
- ⓪"BEGIN
- ⓪$WITH Puff^ DO
- ⓪&INCL (Modus, Editiert);
- ⓪&IF index >= Max THEN RETURN END;
- ⓪&Zeile := MerkPunkte [BlockMarke1].merkline;
- ⓪&IF Zeile = NIL THEN RETURN; END;
- ⓪&REPEAT
- ⓪(GetLine (Zeile, Zeilstr); l := LENGTH (Zeile^.ZeilPointer^);
- ⓪(IF (index > l) & ~links THEN
- ⓪*WHILE (index > l) DO
- ⓪,Zeilstr [l] := ' '; INC (l);
- ⓪*END (* WHILE *);
- ⓪*Zeilstr [l] := nul;
- ⓪(END (* IF index *);
- ⓪(IF (l >= index) THEN
- ⓪*IF links THEN
- ⓪,Delete (Zeilstr, index, 1);
- ⓪*ELSE
- ⓪,Insert (blank, index, Zeilstr);
- ⓪*END (* IF links oder rechts ruecken *);
- ⓪*PutLine (Zeile, Zeilstr);
- ⓪(END (* IF Laenge *);
- ⓪(IF Zeile # MerkPunkte [BlockMarke2].merkline THEN
- ⓪*Zeile := Zeile^.naechste;
- ⓪(END (* IF *);
- ⓪&UNTIL (Zeile = MerkPunkte [BlockMarke2].merkline) OR (Zeile = NIL);
- ⓪$END (* WITH Puff *);
- ⓪"END Ruecke;
- ⓪"
- ⓪ BEGIN (* RueckeBlockEin *)
- ⓪"GotoXY (0, 0); HighLight;
- ⓪"WriteConst (
- ⓪"'Block einrücken (bei Cursor <-, ->), BS, Zeichen, RETURN fuer Ende');
- ⓪"LoescheZeile;
- ⓪"Normal;
- ⓪"blank [0] := ' '; blank [1] := nul;
- ⓪"index := Puff^.MerkPunkte [LaufendeZeile].charpos;
- ⓪"WITH Puff^ DO
- ⓪$GotoXY (MerkPunkte [LaufendeZeile].charpos -
- ⓪*MerkPunkte [ErsteZeile].charpos,
- ⓪*MerkPunkte [LaufendeZeile].zeilpos -
- ⓪,MerkPunkte [ErsteZeile].zeilpos);
- ⓪"END (* WITH *);
- ⓪"REPEAT
- ⓪$bef.TT := keineTaste; Doit := FALSE; Schirm := FALSE;
- ⓪$IF TasteBereit() THEN LiesTaste (bef);
- ⓪$ELSE MausPos (x, y, bewegt, Knoepfe);
- ⓪)IF Left IN Knoepfe THEN
- ⓪+bef.TT := Befehl; bef.bef := RollLeft;
- ⓪)ELSIF Right IN Knoepfe THEN
- ⓪+bef.TT := Befehl; bef.bef := RollRight;
- ⓪)END;
- ⓪$END (* IF *);
- ⓪$IF bef.TT = Befehl THEN
- ⓪&CASE bef.bef OF
- ⓪(tabulator: LoescheQueue;
- ⓪:WITH Puff^ DO
- ⓪<t := TabWeite * ((x DIV TabWeite) + 1);
- ⓪<FOR i := x TO t DO
- ⓪>blank [i - x] := ' ';
- ⓪<END;
- ⓪<blank [t - x + 1] := nul;
- ⓪<Ruecke (FALSE);
- ⓪<INC (MerkPunkte [LaufendeZeile].charpos, t -x + 1);
- ⓪<Doit := TRUE; Schirm := TRUE;
- ⓪<index := MerkPunkte [LaufendeZeile].charpos;
- ⓪:END (* WITH *);|
- ⓪(cursleft: LoescheQueue;
- ⓪:WITH Puff^ DO
- ⓪<IF MerkPunkte [LaufendeZeile].charpos > 0 THEN
- ⓪>DEC (MerkPunkte [LaufendeZeile].charpos);
- ⓪>Doit := TRUE;
- ⓪>index := MerkPunkte [LaufendeZeile].charpos;
- ⓪<END (* IF *);
- ⓪:END (* WITH *);|
- ⓪(DelLChar: LoescheQueue;
- ⓪:WITH Puff^ DO
- ⓪<IF MerkPunkte [LaufendeZeile].charpos > 0 THEN
- ⓪>DEC (MerkPunkte [LaufendeZeile].charpos);
- ⓪>Doit := TRUE; Schirm := TRUE;
- ⓪>index := MerkPunkte [LaufendeZeile].charpos;
- ⓪>Ruecke (TRUE);
- ⓪<END (* IF *);
- ⓪:END (* WITH *);|
- ⓪(cursright: LoescheQueue;
- ⓪:WITH Puff^ DO
- ⓪<IF MerkPunkte [LaufendeZeile].charpos < Max THEN
- ⓪>INC (MerkPunkte [LaufendeZeile].charpos);
- ⓪>Doit := TRUE;
- ⓪>index := MerkPunkte [LaufendeZeile].charpos;
- ⓪<END (* IF *);
- ⓪:END (* WITH *);|
- ⓪(DelRChar, RollLeft (* RollLeft *):
- ⓪:LoescheQueue;
- ⓪:Ruecke (TRUE); Doit := TRUE; Schirm := TRUE;|
- ⓪(RollRight (* RollRight *):
- ⓪:LoescheQueue;
- ⓪:Ruecke (FALSE); Doit := TRUE; Schirm := TRUE;
- ⓪(ELSE;
- ⓪(END (* CASE *);
- ⓪&
- ⓪&ELSE IF bef.TT = Zeichen THEN
- ⓪2(* nicht LoescheQueue!!! *)
- ⓪2IF bef.zch = ' ' THEN LoescheQueue; END;
- ⓪2blank [0] := bef.zch; blank [1] := nul;
- ⓪2Ruecke (FALSE);
- ⓪2Doit := TRUE; Schirm := TRUE;
- ⓪2WITH Puff^ DO
- ⓪4IF MerkPunkte [LaufendeZeile].charpos < Max THEN
- ⓪6INC (MerkPunkte [LaufendeZeile].charpos);
- ⓪6index := Puff^.MerkPunkte [LaufendeZeile].charpos;
- ⓪4END (* IF *);
- ⓪2END (* WITH *);
- ⓪0END (* IF *);
- ⓪$END (* IF *);
- ⓪$IF Doit THEN
- ⓪&(* 12. 1. 88 *)
- ⓪&WITH Puff^ DO
- ⓪(IF Schirm THEN
- ⓪*SchirmSchreiben (Puff, MerkPunkte [BlockMarke1].merkline,
- ⓪;MerkPunkte [BlockMarke2].zeilpos -
- ⓪;MerkPunkte [BlockMarke1].zeilpos + 1, 0);
- ⓪*INCL (Modus, Editiert);
- ⓪(END (* IF Schirm *);
- ⓪(GotoXY (MerkPunkte [LaufendeZeile].charpos -
- ⓪.MerkPunkte [ErsteZeile].charpos,
- ⓪,MerkPunkte [LaufendeZeile].zeilpos -
- ⓪.MerkPunkte [ErsteZeile].zeilpos);
- ⓪&END (* WITH *);
- ⓪$END (* IF Doit *);
- ⓪"UNTIL ((bef.TT = Befehl) & ((bef.bef = return) OR (bef.bef = Quit) OR
- ⓪*(bef.bef = QuitCompile)));
- ⓪"LoescheBlockMarken (Puff);
- ⓪"SchirmSchreiben (Puff, Puff^.MerkPunkte [LaufendeZeile].merkline, 0, 0);
- ⓪ END RueckeBlockEin;
- ⓪
- ⓪ PROCEDURE SucheWort (Puff: einPufferPointer;
- ⓪5w: ARRAY OF CHAR; VAR gefunden: BOOLEAN;
- ⓪5key: einTasteneintrag (* cursup, cursdown, return *));
- ⓪
- ⓪ (* Schnelle Stringsuche nach Boyer-Moore, vgl. N. Wirth: Algorithmen
- ⓪#und Datenstrukturen mit Modula-2, Teubner 1986, S. 67ff *)
- ⓪ VAR LaufZeil: einLinePointer; (* Zeile in der gerade
- ⓪Kgesucht wird *)
- ⓪&ZeilNum: CARDINAL; (* Nummer der aktu. Zeile *)
- ⓪&startx: CARDINAL; (* Position, ab der in der
- ⓪KZeile gesucht werden soll *)
- ⓪&findx: CARDINAL; (* gefundene Position *)
- ⓪&dummy: CHAR;
- ⓪&gross: BOOLEAN;
- ⓪&up: BOOLEAN;
- ⓪&
- ⓪&Tabelle: ARRAY [0C..377C] OF INTEGER; (* Tabelle der Zeichen-
- ⓪@positionen im String (von hinten) *)
- ⓪&M, j: INTEGER; (* M: Laenge des Suchstrings *)
- ⓪&L: CARDINAL; (* Laenge der untersuchten Zeile *)
- ⓪
- ⓪$PROCEDURE LCAP (ch: CHAR): CHAR;
- ⓪$BEGIN
- ⓪&IF gross THEN
- ⓪(RETURN CAP (ch)
- ⓪&ELSE
- ⓪(RETURN ch;
- ⓪&END;
- ⓪$END LCAP;
- ⓪
- ⓪$PROCEDURE LCAPS (VAR s: ARRAY OF CHAR; L: INTEGER);
- ⓪$VAR i: INTEGER;
- ⓪$BEGIN
- ⓪&IF L > 0 THEN
- ⓪(FOR i := 0 TO L - 1 DO
- ⓪*s [i] := (*L*)CAP (s [i]);
- ⓪(END (* FOR *);
- ⓪&END (* IF *);
- ⓪$END LCAPS;
- ⓪
- ⓪"PROCEDURE Pos (start: CARDINAL; VAR substr, str: ARRAY OF CHAR;
- ⓪1N: INTEGER): CARDINAL;
- ⓪"VAR index, k, j: INTEGER;
- ⓪(ch: CHAR;
- ⓪
- ⓪"BEGIN
- ⓪$(* N := LENGTH (str); *)
- ⓪$IF M > N THEN RETURN N + 1 END;
- ⓪$index := M + INTEGER (start);
- ⓪((* Index, bei dem die Suche startet (Wortende) *)
- ⓪$REPEAT
- ⓪&j := M; k := index; (* Laufindizes setzen *)
- ⓪&REPEAT
- ⓪(DEC (k); DEC (j);
- ⓪&UNTIL (j < 0) OR (substr [j] # LCAP (str [k]));
- ⓪((* vergleicht substr [j] mit str [k] bis Ungleichheit oder
- ⓪+Suchstring erschoepft *)
- ⓪&IF (j >= 0) THEN INC (index, Tabelle [ LCAP (str [index - 1])]);
- ⓪&END (* IF nicht gefunden *);
- ⓪$UNTIL (j < 0) OR (index > N);
- ⓪$IF (j < 0) & (index <= N) THEN
- ⓪&RETURN CARDINAL (index - M);
- ⓪$ELSE
- ⓪&RETURN CARDINAL (N + 1);
- ⓪$END (* IF *);
- ⓪"END Pos;
- ⓪"
- ⓪"PROCEDURE WortTest (VAR s: ARRAY OF CHAR): BOOLEAN;
- ⓪"VAR links, rechts: BOOLEAN;
- ⓪"(* findx ist die Startposition des Suchstrings, findx + M - 1 die Endp. *)
- ⓪"(* L ist die Laenge der untersuchten Zeile *)
- ⓪"BEGIN
- ⓪$IF ~(WortSuche IN Puff^.Modus) THEN
- ⓪&RETURN TRUE;
- ⓪$ELSE
- ⓪&links := (findx = 0) OR (s [findx] IN TrennSet) OR
- ⓪/(s [findx - 1] IN TrennSet);
- ⓪&IF ~links THEN RETURN FALSE
- ⓪&ELSE
- ⓪(rechts := (findx + CARDINAL (M) > L) OR
- ⓪2(s [findx + CARDINAL (M) - 1] IN TrennSet) OR
- ⓪2(s [findx + CARDINAL (M)] IN TrennSet);
- ⓪(RETURN rechts;
- ⓪&END (* inneres IF *);
- ⓪$END (* IF *);
- ⓪"END WortTest;
- ⓪
- ⓪ VAR d: CHAR;
- ⓪
- ⓪ BEGIN (* SucheWort *)
- ⓪"up := key.bef = cursup;
- ⓪"
- ⓪"M := LENGTH (w); (* Anzahl der Zeichen im Suchstring *)
- ⓪
- ⓪"IF ~(GrossKleinSuche IN Puff^.Modus) THEN
- ⓪$gross := TRUE; LCAPS (w, M);
- ⓪"ELSE
- ⓪$gross := FALSE;
- ⓪"END (* IF nicht Gross und Klein unterscheiden *);
- ⓪"(* Initialisieren der Suchtabelle: Fuer jedes Zeichen, das im
- ⓪%Suchstring vorkommt, wird festgehalten, wie weit sein letztes
- ⓪%Vorkommen vom Ende des Strings entfernt ist. *)
- ⓪"
- ⓪"FOR dummy := 0C TO 377C DO
- ⓪$Tabelle [dummy] := M; (* Tabelle vor-initalisieren *)
- ⓪"END (* FOR *);
- ⓪
- ⓪"(* Fuer jede Position im Suchwort w wird unter dem Index des
- ⓪%jten Zeichens in die Tabelle der Abstand vom Ende des Such-
- ⓪%wortes eingetragen. *)
- ⓪"FOR j := 0 TO M-2 DO
- ⓪$Tabelle [w [j]] := M - j - 1;
- ⓪"END (* FOR *);
- ⓪"
- ⓪"WITH Puff^ DO
- ⓪$LaufZeil := MerkPunkte [LaufendeZeile].merkline;
- ⓪$ZeilNum := MerkPunkte [LaufendeZeile].zeilpos;
- ⓪$startx := MerkPunkte [LaufendeZeile].charpos;
- ⓪$
- ⓪$L := LENGTH (LaufZeil^.ZeilPointer^);
- ⓪$findx := Pos (startx, w, LaufZeil^.ZeilPointer^, L);
- ⓪$LOOP
- ⓪&IF ~ ((findx > L) OR ~WortTest (LaufZeil^.ZeilPointer^)) THEN
- ⓪(EXIT;
- ⓪&END (* IF *);
- ⓪&IF up THEN
- ⓪(IF (LaufZeil^.vorige # Puffer) & (findx > L) THEN
- ⓪*LaufZeil := LaufZeil^.vorige; startx := 0;
- ⓪*L := LENGTH (LaufZeil^.ZeilPointer^); DEC (ZeilNum);
- ⓪(ELSIF (LaufZeil^.vorige = Puffer) & (findx > L) THEN
- ⓪*EXIT;
- ⓪(END (* IF *);
- ⓪&ELSE (* IF ~up *)
- ⓪(IF (LaufZeil^.naechste # NIL) & (findx > L) THEN
- ⓪*LaufZeil := LaufZeil^.naechste; startx := 0;
- ⓪*L := LENGTH (LaufZeil^.ZeilPointer^); INC (ZeilNum);
- ⓪(ELSIF (LaufZeil^.naechste = NIL) & (findx > L) THEN
- ⓪*EXIT;
- ⓪(ELSE
- ⓪*startx := startx + CARDINAL (M);
- ⓪(END (* IF *);
- ⓪&END (* IF up *);
- ⓪&findx := Pos (startx, w, LaufZeil^.ZeilPointer^, L);
- ⓪$END (* LOOP *);
- ⓪"
- ⓪$IF (findx < L) (* & WortTest (LaufZeil^.ZeilPointer^) *) THEN
- ⓪&MerkPunkte [LaufendeZeile].charpos := findx + CARDINAL (M);
- ⓪&MerkPunkte [LaufendeZeile].merkline := LaufZeil;
- ⓪&MerkPunkte [LaufendeZeile].zeilpos := ZeilNum;
- ⓪&MerkPunkte [ErsteZeile].merkline := MerkPunkte [LaufendeZeile].merkline;
- ⓪&MerkPunkte [ErsteZeile].zeilpos := MerkPunkte [LaufendeZeile].zeilpos - 1;
- ⓪&WHILE (MerkPunkte [ErsteZeile].merkline^.vorige # Puffer) &
- ⓪,((MerkPunkte [ErsteZeile].zeilpos + LinesOnScreen DIV 2) >
- ⓪,MerkPunkte [LaufendeZeile].zeilpos) DO
- ⓪(MerkPunkte [ErsteZeile].merkline :=
- ⓪*MerkPunkte [ErsteZeile].merkline^.vorige;
- ⓪(DEC (MerkPunkte [ErsteZeile].zeilpos);
- ⓪&END (* WHILE *);
- ⓪&gefunden := TRUE;
- ⓪$ELSE
- ⓪&gefunden := FALSE;
- ⓪$END (* IF gefunden *);
- ⓪"END (* WITH *);
- ⓪ END SucheWort;
- ⓪
- ⓪ PROCEDURE TauscheWort (Puff: einPufferPointer;
- ⓪7VAR s, t: ARRAY OF CHAR; maxx: CARDINAL;
- ⓪7modus: einTasteneintrag);
- ⓪ VAR Zeile: eineZeile;
- ⓪(sl: CARDINAL;
- ⓪ BEGIN
- ⓪"sl := LENGTH (s);
- ⓪"WITH Puff^ DO
- ⓪$DEC (MerkPunkte [LaufendeZeile].charpos, sl);
- ⓪$GetLine (MerkPunkte [LaufendeZeile].merkline, Zeile);
- ⓪$Delete (Zeile, MerkPunkte [LaufendeZeile].charpos, sl);
- ⓪$IF CAP (modus.zch) = 'F' THEN
- ⓪$END (* IF modus *);
- ⓪$IF (LENGTH (Zeile) + LENGTH (t) <= cZeile) THEN
- ⓪&Insert (t, MerkPunkte [LaufendeZeile].charpos, Zeile);
- ⓪&INCL (Modus, Editiert);
- ⓪&sl := LENGTH (t);
- ⓪$ELSE Insert (s, MerkPunkte [LaufendeZeile].charpos, Zeile);
- ⓪$END (* IF *);
- ⓪$PutLine (MerkPunkte [LaufendeZeile].merkline, Zeile);
- ⓪$INC (MerkPunkte [LaufendeZeile].charpos, sl);
- ⓪"END (* WITH Puff *);
- ⓪ END TauscheWort;
- ⓪
- ⓪ (* END EditUtil. *)
- ⓪
- ⓪ (**************************** EditScreen ****************************)
- ⓪
- ⓪ CONST cTabWeite = 8;
- ⓪
- ⓪ VAR Handle: INTEGER;
- ⓪(CursorAn: BOOLEAN;
- ⓪(CursorBlink: BOOLEAN;
- ⓪(alteBlinkrate: INTEGER;
- ⓪(altesAttribut: INTEGER;
- ⓪
- ⓪ PROCEDURE InsertZeile (Puff: einPufferPointer; n: CARDINAL);
- ⓪ BEGIN
- ⓪"WITH Puff^ DO
- ⓪$GotoXY (0, n - MerkPunkte [ErsteZeile].zeilpos);
- ⓪$InsertLn;
- ⓪"END (* WITH *);
- ⓪ END InsertZeile;
- ⓪
- ⓪ PROCEDURE DeleteZeile (Puff: einPufferPointer; n: CARDINAL);
- ⓪ BEGIN
- ⓪"WITH Puff^ DO
- ⓪$GotoXY (0, n - MerkPunkte [ErsteZeile].zeilpos);
- ⓪$DeleteLn;
- ⓪"END (* WITH *);
- ⓪ END DeleteZeile;
- ⓪
- ⓪ PROCEDURE High (v, h: CHAR; n: ARRAY OF CHAR);
- ⓪ BEGIN
- ⓪"WriteChar (v); HighLight; WriteChar (h); Normal;
- ⓪"WriteLine (n);
- ⓪ END High;
- ⓪
- ⓪ PROCEDURE HighL (v, h: CHAR; n: ARRAY OF CHAR);
- ⓪ BEGIN
- ⓪"High (v, h, n); WriteLn;
- ⓪ END HighL;
- ⓪
- ⓪ VAR endline: CARDINAL; (* Very dirty - see HighLine & Schirmschreiben *)
- ⓪
- ⓪ PROCEDURE WriteString (xoff: CARDINAL; (*Control, Tabs: BOOLEAN;*)
- ⓪7VAR s: ARRAY OF CHAR);
- ⓪ (* Schnelle Stringausgabe, nicht durch ^C abbrechbar. *)
- ⓪ CONST cPufferlaenge = 400;
- ⓪ VAR (*$Reg*)sindex, (*$Reg*)bildsind, (*$Reg*)l, (*$Reg*)sichtbarez,
- ⓪(tabsexp: CARDINAL;
- ⓪(bilds: ARRAY [0..cPufferlaenge] OF CHAR;
- ⓪(high, low: CHAR;
- ⓪(x, y: CARDINAL;
- ⓪((*tj: CARDINAL;*)
- ⓪ BEGIN
- ⓪"WhereXY (x, y);
- ⓪"high := 'p'; low := 'q';
- ⓪"(*IF ~Tabs THEN tj := tabjump ELSE tj := 1; END;*)
- ⓪"sindex := xoff;
- ⓪"bildsind := 0; l := LENGTH (s); sichtbarez := 0;
- ⓪"WHILE (sindex < l) & (sichtbarez + CARDINAL (x) <= CharsInLine) &
- ⓪((bildsind + 5 <= cPufferlaenge) DO
- ⓪$IF (s [sindex] = escape)
- ⓪$AND ((s [sindex + 1] = 'q') OR (s [sindex + 1] = 'p')) THEN
- ⓪&IF (s [sindex + 1] = 'p') THEN
- ⓪(high := 'q'; low := 'p';
- ⓪&ELSIF (s [sindex + 1] = 'q') THEN
- ⓪(high := 'p'; low := 'q';
- ⓪&END (* IF *);
- ⓪&bilds [bildsind] := s [sindex]; bilds [bildsind + 1] := s [sindex + 1];
- ⓪&INC (bildsind); INC (sindex);
- ⓪$(*
- ⓪$ELSIF (s [sindex] = tab) & ~Tabs THEN
- ⓪&tabsexp := sichtbarez + CARDINAL (x) - 1;
- ⓪&INC (tabsexp, tabjump * ((tabsexp DIV tabjump) + 1) - tabsexp);
- ⓪&DEC (tabsexp, CARDINAL (x) - 1);
- ⓪&WHILE (sichtbarez < tabsexp) DO
- ⓪(bilds [bildsind] := ' '; INC (bildsind); INC (sichtbarez);
- ⓪&END (* WHILE *);
- ⓪&DEC (bildsind);
- ⓪$*)
- ⓪$ELSIF (s [sindex] < ' ') THEN
- ⓪&(*IF Control THEN*)
- ⓪(bilds [bildsind] := escape; bilds [bildsind + 1] := high;
- ⓪(bilds [bildsind + 2] := CHR (ORD (s [sindex]) + ORD ('@'));
- ⓪(bilds [bildsind + 3] := escape; bilds [bildsind + 4] := low;
- ⓪(INC (bildsind, 4);
- ⓪&(*END (* IF *);*)
- ⓪$ELSE
- ⓪&bilds [bildsind] := s [sindex]; INC (sichtbarez);
- ⓪$END (* IF *);
- ⓪$INC (sindex); INC (bildsind);
- ⓪"END (* WHILE *);
- ⓪"bilds [bildsind] := nul; endline := sichtbarez;
- ⓪"WriteLine (bilds);
- ⓪ END WriteString;
- ⓪
- ⓪ PROCEDURE HighLine (start, ende, xoff: CARDINAL; (*Control, Tabs: BOOLEAN;*)
- ⓪4VAR s: ARRAY OF CHAR);
- ⓪ VAR p: ARRAY [0..511] OF CHAR;
- ⓪((*$Reg*)i, (*$Reg*)j, (*$Reg*)l, (*$Reg*)k: CARDINAL;
- ⓪ BEGIN
- ⓪"(*IF ~Tabs THEN tj := tabjump ELSE tj := 1 END;*)
- ⓪"i := xoff;
- ⓪"j := 0; l := LENGTH (s); k := 0;
- ⓪"IF (i > start) & (i < ende) THEN
- ⓪$p [j] := escape; p [j + 1] := 'p'; INC (j, 2);
- ⓪"END;
- ⓪"WHILE (i < l) & (k <= CharsInLine) DO
- ⓪$IF i = start THEN
- ⓪&p [j] := escape; p [j + 1] := 'p';
- ⓪&INC (j, 2);
- ⓪$END (* IF start HighLight *);
- ⓪$IF i = ende THEN
- ⓪&p [j] := escape; p [j + 1] := 'q';
- ⓪&INC (j, 2);
- ⓪$END (* IF ende HighLight *);
- ⓪$p [j] := s [i]; INC (j); INC (i); INC (k);
- ⓪"END (* WHILE *);
- ⓪"IF i <= ende THEN
- ⓪$p [j] := escape; p [j + 1] := 'q';
- ⓪$INC (j, 2);
- ⓪"END (* IF ende HighLight *);
- ⓪"p [j] := nul;
- ⓪"WriteString (0, (*Control, Tabs,*) p);
- ⓪ END HighLine;
- ⓪
- ⓪ PROCEDURE MakeHighLine (Puff: einPufferPointer; (*Control, Tabs: BOOLEAN;*)
- ⓪8argzeile: CARDINAL;
- ⓪8VAR inhalt: ARRAY OF CHAR);
- ⓪ VAR (*$Reg*)zeile, (*$Reg*)zeil1, (*$Reg*)zeil2: CARDINAL;
- ⓪ BEGIN
- ⓪"WITH Puff^ DO
- ⓪$zeil1:= MerkPunkte [BlockMarke1].zeilpos;
- ⓪$IF zeil1 = 0 THEN
- ⓪&(* kein Block markiert *)
- ⓪&WriteString (MerkPunkte [ErsteZeile].charpos, (*Control, Tabs,*) inhalt);
- ⓪$ELSE
- ⓪&zeile:= argzeile; (* um sie als Reg-Var benutzen zu können *)
- ⓪&zeil2:= MerkPunkte [BlockMarke2].zeilpos;
- ⓪&IF zeil2 = 0 THEN
- ⓪((* kein Block markiert *)
- ⓪(WriteString (MerkPunkte [ErsteZeile].charpos, (*Control, Tabs,*) inhalt);
- ⓪&ELSIF (zeil1 < zeile) & (zeil2 > zeile) THEN
- ⓪(HighLine (0, LENGTH (inhalt), MerkPunkte [ErsteZeile].charpos,
- ⓪2(*Control, Tabs,*) inhalt);
- ⓪&ELSIF (zeil1 = zeile) & (zeil2 > zeile) THEN
- ⓪(HighLine (MerkPunkte [BlockMarke1].charpos, LENGTH (inhalt),
- ⓪2MerkPunkte [ErsteZeile].charpos, (*Control, Tabs,*) inhalt)
- ⓪&ELSIF (zeil1 = zeile) & (zeil2 = zeile) THEN
- ⓪(HighLine (MerkPunkte [BlockMarke1].charpos,
- ⓪2MerkPunkte [BlockMarke2].charpos,
- ⓪2MerkPunkte [ErsteZeile].charpos, (*Control, Tabs,*) inhalt);
- ⓪&ELSIF (zeil1 < zeile) & (zeil2 = zeile) THEN
- ⓪(HighLine (0, MerkPunkte [BlockMarke2].charpos,
- ⓪2MerkPunkte [ErsteZeile].charpos, (*Control, Tabs,*) inhalt);
- ⓪&ELSE
- ⓪(WriteString (MerkPunkte [ErsteZeile].charpos, (*Control, Tabs,*) inhalt);
- ⓪&END (* IF *);
- ⓪$END (* IF *);
- ⓪"END (* WITH *);
- ⓪ END MakeHighLine;
- ⓪
- ⓪ PROCEDURE SchirmSchreiben2 (Puff: einPufferPointer;
- ⓪<Start: einLinePointer;
- ⓪<Anzahl: CARDINAL;
- ⓪<SOffset: INTEGER);
- ⓪
- ⓪ (* Start sollte die erste geaenderte Zeile sein. Schirm-
- ⓪#Schreiben bestimmt daraus und aus der ZeilenNummer von Puff.Erste-
- ⓪#Zeile die Schnittmenge der auf dem Bildschirm darzustellenden
- ⓪#Zeilen sowie den korrekten Y-Offset. Die rufenden Prozeduren sollten
- ⓪#sich nicht darum kuemmern muessen, ob der geforderte Updating-Bereich
- ⓪#ganz, teilweise oder garnicht im aktuellen Bildschirmfenster (defi-
- ⓪#niert durch ErsteZeile) sichtbar ist.
- ⓪#SOffset gibt an, ob der geaenderte Bereich kuerzer (<0) oder
- ⓪#laenger (>0) geworden ist.
- ⓪#Dieses Verfahren beruht auf einer Idee von Martin Odersky. *)
- ⓪#
- ⓪ VAR (*$Reg*)y, (*$Reg*)i: CARDINAL;
- ⓪%(*$Reg*)zeile: CARDINAL;
- ⓪%Help, UntereZeile: einLinePointer;
- ⓪%(*$Reg*)schreib: BOOLEAN;
- ⓪%loesche: BOOLEAN;
- ⓪%sta, (*$Reg*)erst: CARDINAL;
- ⓪ BEGIN
- ⓪"zeile := Puff^.MerkPunkte [ErsteZeile].zeilpos + 1; (* oberste Schirmzeile *)
- ⓪"IF Anzahl = 0 THEN
- ⓪$(* LoescheBild; *)
- ⓪$loesche := TRUE; schreib := TRUE;
- ⓪$Anzahl := LinesOnScreen;
- ⓪"ELSE loesche := FALSE; schreib := FALSE;
- ⓪'erst := zeile;
- ⓪'SucheZeilenNummer (Puff, Start, sta);
- ⓪'IF sta < erst THEN Start := Puff^.MerkPunkte [ErsteZeile].merkline; END;
- ⓪"END (* IF *);
- ⓪"WITH Puff^ DO
- ⓪$Help := MerkPunkte [ErsteZeile].merkline;
- ⓪$y := 1;
- ⓪$CursorAus;
- ⓪$WHILE (y <= LinesOnScreen) & (Help # NIL) & (0 < Anzahl) DO
- ⓪&IF Start = Help THEN
- ⓪((* Ab dieser Zeile schreiben wir auf den Schirm... *)
- ⓪(schreib := TRUE;
- ⓪
- ⓪(IF (SOffset < 0) THEN
- ⓪*(* Zeilen werden geloescht - die untersten Bildschirm-
- ⓪-zeilen muessen nachgetragen werden *)
- ⓪*UntereZeile := MerkPunkte [ErsteZeile].merkline;
- ⓪*i := 0;
- ⓪*(* Suchen der Zeile, die unter dem unteren Rand steht: *)
- ⓪*WHILE (i < CARDINAL (INTEGER (LinesOnScreen) + SOffset)) &
- ⓪0(UntereZeile # NIL) DO
- ⓪,UntereZeile := UntereZeile^.naechste; INC (i);
- ⓪*END (* WHILE *);
- ⓪(END (* IF *);
- ⓪(
- ⓪((* Schirmrest nach oben ziehen *)
- ⓪(WHILE (SOffset < 0) DO
- ⓪*GotoXY (0, y);
- ⓪*WriteChar (escape); WriteChar (linedel); INC (SOffset);
- ⓪*IF UntereZeile # NIL THEN
- ⓪,GotoXY (0, LinesOnScreen);
- ⓪,WriteString (MerkPunkte [ErsteZeile].charpos,
- ⓪9(*ControlZeichen IN Modus, TabFiltern IN Modus,*)
- ⓪9UntereZeile^.ZeilPointer^);
- ⓪,UntereZeile := UntereZeile^.naechste;
- ⓪*END (* IF UntereZeile *);
- ⓪(END (* WHILE *);
- ⓪(
- ⓪((* Schirmrest nach unten stossen *)
- ⓪(WHILE (SOffset > 0) DO
- ⓪*WriteChar (escape); WriteChar (lineins); DEC (SOffset);
- ⓪(END (* WHILE *);
- ⓪&END (* IF Start = Help *);
- ⓪&
- ⓪&IF schreib THEN
- ⓪(GotoXY (0, y);
- ⓪(MakeHighLine (Puff, (*ControlZeichen IN Modus, TabFiltern IN Modus,*)
- ⓪6zeile, Help^.ZeilPointer^);
- ⓪(IF endline + 1 < CharsInLine THEN LoescheZeile; END;
- ⓪*(* GRRRR no one will understand this code... ask me! It's a beautiful side-effect! *)
- ⓪(DEC (Anzahl);
- ⓪&END (* IF schreib *);
- ⓪&INC (y); Help := Help^.naechste;
- ⓪&INC (zeile);
- ⓪$END (* WHILE *);
- ⓪$IF loesche THEN LoescheEndeBild; END;
- ⓪$CursorEin;
- ⓪"END (* WITH *);
- ⓪ END SchirmSchreiben2;
- ⓪
- ⓪
- ⓪ PROCEDURE SchirmSchreiben (Puff: einPufferPointer; Start: einLinePointer;
- ⓪<Anzahl: CARDINAL; SOffset: INTEGER);
- ⓪"VAR clip: Rectangle;
- ⓪"BEGIN
- ⓪$UpdateWindow (TRUE);
- ⓪$clip:= WindowRectList (WindowHandle, firstElem);
- ⓪$WHILE clip.w # 0 DO
- ⓪&SetClipping (ScreenHandle, clip);
- ⓪&SchirmSchreiben2 (Puff, Start, Anzahl, SOffset);
- ⓪&clip := WindowRectList (WindowHandle, nextElem);
- ⓪$END;
- ⓪$DisableClipping (ScreenHandle);
- ⓪$UpdateWindow (FALSE);
- ⓪"END SchirmSchreiben;
- ⓪
- ⓪ (* END EditScreen. *)
- ⓪
- ⓪ (************************* EditLine **********************************)
- ⓪
- ⓪ VAR rScreen: CARDINAL;
- ⓪(d: ARRAY [0..0] OF CHAR;
- ⓪(x: CARDINAL;
- ⓪((*ok: BOOLEAN;*) (* Weil Screen Funktionen exp. *)
- ⓪(warBlank: BOOLEAN; (* SkipBlank *)
- ⓪(switch: BOOLEAN; (* SkipBlank *)
- ⓪(control: BOOLEAN;
- ⓪(Length,
- ⓪(expandedLength: CARDINAL;
- ⓪(bewegt: BOOLEAN;
- ⓪(Knoepfe: ButtonSet;
- ⓪(p: eineZeile;
- ⓪
- ⓪ PROCEDURE PufferName ( p0: einPufferPointer; VAR s: ARRAY OF CHAR);
- ⓪ VAR ok: BOOLEAN;
- ⓪((*$Reg*) p: einPufferPointer;
- ⓪ BEGIN
- ⓪$p:= p0;
- ⓪$IF p = AlternEdit THEN Assign ('<ALTE>', s);
- ⓪$ELSIF p = ClipBoard THEN Assign ('<CLIP>', s);
- ⓪$ELSIF p = HilfsPuffer THEN Assign ('<HELP>', s);
- ⓪$ELSIF p = ConfigPuffer THEN Assign ('<CONF>', s);
- ⓪$ELSIF p = DruckPuff THEN Assign ('<DRUC>', s);
- ⓪$ELSIF p = FehlerPuffer THEN Assign ('<FEHL>', s);
- ⓪$ELSIF p = MailPuffer THEN Assign ('<MAIL>', s);
- ⓪$ELSIF p = GolemPuffer THEN Assign ('<GOLE>', s);
- ⓪$ELSIF p = SendePuffer THEN Assign ('<SEND>', s);
- ⓪$ELSIF p = PSCPuffer THEN Assign ('<PSCP>', s);
- ⓪$ELSIF p = DruckerBatch THEN Assign ('<DRUC>', s);
- ⓪$(*ELSIF p = TextVergleich THEN Assign ('<VERG>', s);*)
- ⓪$ELSIF p = WaehlPuffer THEN Assign ('<WAEH>', s);
- ⓪$ELSIF p = StartPuffer THEN Assign ('<STAR>', s);
- ⓪$ELSIF p = Puffer1 THEN Assign ('<PUF1>', s);
- ⓪$ELSIF p = Puffer2 THEN Assign ('<PUF2>', s);
- ⓪$ELSIF p = Puffer3 THEN Assign ('<PUF3>', s);
- ⓪$ELSIF p = Puffer4 THEN Assign ('<PUF4>', s);
- ⓪$ELSIF p = LoadPuffer THEN Assign ('<LOAD>', s);
- ⓪$ELSE Assign ('<BASE>', s);
- ⓪"END;
- ⓪ END PufferName;
- ⓪
- ⓪ VAR DummyPuffer: einPufferPointer;
- ⓪
- ⓪ PROCEDURE Prompt (zeile: CARDINAL;
- ⓪1info: ARRAY OF CHAR;
- ⓪1VAR eingabe: ARRAY OF CHAR;
- ⓪1VAR key: einTasteneintrag);
- ⓪ VAR x: CARDINAL;
- ⓪(overflow, marginoverflow, editiert: BOOLEAN;
- ⓪(dx, dy: CARDINAL;
- ⓪ BEGIN
- ⓪"IF DummyPuffer = NIL THEN
- ⓪$NEW (DummyPuffer); PuffInit (DummyPuffer);
- ⓪$IF DummyPuffer = NIL THEN
- ⓪&Nachricht ('Kann Dummypuffer|nicht anlegen.900');
- ⓪&(* Eh--- wo ist Liste der Fehlerleitnummern? *)
- ⓪&RETURN;
- ⓪$END;
- ⓪$DummyPuffer^.NaechsterPuffer := DummyPuffer;
- ⓪"END;
- ⓪"x := LENGTH (eingabe);
- ⓪"GotoXY (0, zeile); WriteLine (eingabe); LoescheZeile;
- ⓪"WITH DummyPuffer^ DO
- ⓪$MerkPunkte [LaufendeZeile].zeilpos := zeile;
- ⓪$MerkPunkte [ErsteZeile].zeilpos := 0;
- ⓪$MerkPunkte [ErsteZeile].charpos := 0;
- ⓪$REPEAT
- ⓪&MerkPunkte [LaufendeZeile].charpos := x;
- ⓪&PutLine (MerkPunkte [LaufendeZeile].merkline, eingabe);
- ⓪&Edit (DummyPuffer, eingabe, FALSE, TRUE, info, overflow, marginoverflow,
- ⓪,FALSE, dx, dy, key);
- ⓪&IF (key.TT = Befehl) & ((key.bef = Quit) OR (key.bef = QuitCompile)) THEN
- ⓪(eingabe [0] := nul ; GotoXY (0, zeile); LoescheZeile; x := 0;
- ⓪&END (* IF *);
- ⓪$UNTIL (key.TT = Befehl) &
- ⓪*(key.bef IN Befehlssatz {return, cursup, cursdown});
- ⓪"END (* WITH DummyPuffer *);
- ⓪ END Prompt;
- ⓪
- ⓪ PROCEDURE Edit (Puff: einPufferPointer;
- ⓪0VAR s: ARRAY OF CHAR; (* Zu editierende Zeile *)
- ⓪4zeighelp, DoVorlauf: BOOLEAN; (* Prompt anzeigen *)
- ⓪0VAR info: ARRAY OF CHAR; (* aktuelle Information *)
- ⓪0VAR overflow: BOOLEAN; (* Zeilenüberlauf *)
- ⓪0VAR marginoverflow: BOOLEAN; (* Bildschirmüberlauf *)
- ⓪4exit: BOOLEAN;
- ⓪0VAR mx, my: CARDINAL; (* MausPos vor Tastendruck *)
- ⓪0VAR termch: einTasteneintrag); (* FunktionsCode,
- ⓪Jmit dem die Zeile abgebrochen wurde *)
- ⓪
- ⓪ VAR z: CARDINAL;
- ⓪(lokaleditiert: BOOLEAN;
- ⓪(ll: CARDINAL;
- ⓪(ok: BOOLEAN;
- ⓪(starty, xoffset: CARDINAL;
- ⓪(ZeileGueltig: BOOLEAN;
- ⓪
- ⓪"PROCEDURE InsChar (ch: CHAR);
- ⓪"BEGIN
- ⓪$CursorAus;
- ⓪$IF x >= xoffset THEN
- ⓪&GotoXY (x - xoffset, starty);
- ⓪&WriteString (x, s);
- ⓪&GotoXY (x - xoffset, starty); CursorEin;
- ⓪$END;
- ⓪"END InsChar;
- ⓪"
- ⓪"PROCEDURE DelChar;
- ⓪"BEGIN
- ⓪$CursorAus;
- ⓪$IF x >= xoffset THEN
- ⓪&GotoXY (x - xoffset, starty);
- ⓪&WriteString (x, s);
- ⓪&LoescheZeile;
- ⓪&GotoXY (x - xoffset, starty); CursorEin;
- ⓪$END;
- ⓪"END DelChar;
- ⓪"
- ⓪"PROCEDURE SkipBlank (ch: CHAR): BOOLEAN;
- ⓪"BEGIN
- ⓪$switch := warBlank;
- ⓪$warBlank := warBlank OR (ch IN CharSet {0C..' ',
- ⓪L',', ';', '.', '(',
- ⓪L')', '[', ']', '{', '}',
- ⓪L':', '!', '/', '*', '-',
- ⓪L'+', '&', '~', '=', '^',
- ⓪L'#', '|', '<', '>'});
- ⓪$IF warBlank & (ch # ' ') & switch THEN
- ⓪&warBlank := FALSE;
- ⓪&switch := FALSE;
- ⓪&RETURN FALSE; (* Cursor bleibt stehen *)
- ⓪$ELSE RETURN TRUE; (* Cursor läuft weiter *)
- ⓪$END (* IF *);
- ⓪"END SkipBlank;
- ⓪"
- ⓪"PROCEDURE LiesZeichen (VAR z: einTasteneintrag);
- ⓪"BEGIN
- ⓪$REPEAT
- ⓪&LiesTaste (z);
- ⓪&IF z.TT = Befehl THEN
- ⓪(LoescheQueue;
- ⓪(
- ⓪(IF (z.bef = LeftMous) OR (z.bef = RightMous) THEN
- ⓪(
- ⓪*MausPos (mx, my, bewegt, Knoepfe);
- ⓪*IF (my > CharHeight + CharHeight) & (my < CharHeight * 3) THEN
- ⓪,CASE z.bef OF
- ⓪.LeftMous: z.bef := Rolldown;|
- ⓪.RightMous: z.bef := zumDAnf;|
- ⓪,END;
- ⓪*ELSIF (my > ScreenHeight - 3) THEN
- ⓪,CASE z.bef OF
- ⓪.LeftMous: z.bef := Rollup;|
- ⓪.RightMous: z.bef := zumDEnde;|
- ⓪,END;
- ⓪*ELSIF (mx < 3) & (xoffset > 0) THEN
- ⓪,CASE z.bef OF
- ⓪.RightMous: z.bef := RollFLeft;|
- ⓪.LeftMous: z.bef := RollLeft;|
- ⓪.ELSE;
- ⓪,END;
- ⓪*ELSIF (mx > ScreenWidth - 3) THEN
- ⓪,CASE z.bef OF
- ⓪.RightMous: z.bef := RollFRight;|
- ⓪.LeftMous: z.bef := RollRight;|
- ⓪.ELSE;
- ⓪,END;
- ⓪*END (* IF Knoepfe *);
- ⓪(END (* IF bef = Left oder RightMous *);
- ⓪&END (* IF Befehl *);
- ⓪$UNTIL z.TT # keineTaste;
- ⓪"END LiesZeichen;
- ⓪"
- ⓪"VAR zeilstr: ARRAY [0..10] OF CHAR;
- ⓪"
- ⓪"PROCEDURE Vorlauf;
- ⓪"CONST cmaxx = 132; (* ??? *)
- ⓪"VAR geschrieben: CARDINAL;
- ⓪*blankend: ARRAY [0..cmaxx] OF CHAR;
- ⓪*Length, i: CARDINAL;
- ⓪*pname: ARRAY [0..5] OF CHAR;
- ⓪"BEGIN
- ⓪$(*TopBox;*)
- ⓪$CursorAus;
- ⓪$GotoXY (0, 0); HighLight;
- ⓪$IF zeighelp THEN
- ⓪&WITH Puff^ DO
- ⓪(PufferName (Puff, pname);
- ⓪(WriteLine (pname);
- ⓪(WriteConst (" ZL: "); (* 11 *)
- ⓪(ConvCard (ZeilenAnzahl, 5, zeilstr); (* 5 *)
- ⓪(WriteLine (zeilstr); WriteChar ('/'); (* 1 *)
- ⓪(ConvCard (MerkPunkte [LaufendeZeile].zeilpos, 5, zeilstr);
- ⓪(WriteLine (zeilstr); (* 5 *)
- ⓪(WriteConst (' SP: '); (* 5 *)
- ⓪(ConvCard (x + 1, 3, zeilstr);
- ⓪(WriteLine (zeilstr); (* 3 *)
- ⓪(geschrieben := 30;
- ⓪(IF OverWrite IN Modus THEN WriteConst (' <Überschr'); INC (geschrieben, 10);
- ⓪(ELSE WriteConst (' <Einfüg'); INC (geschrieben, 8);
- ⓪(END (* IF *);
- ⓪(IF AutoIndent IN Modus THEN WriteConst (' Indent> '); INC (geschrieben, 9);
- ⓪(ELSE WriteConst ('> '); INC (geschrieben, 2);
- ⓪(END (* IF *);
- ⓪&END (* WITH Puff^ *);
- ⓪$ELSE geschrieben := 0;
- ⓪$END (* IF *);
- ⓪$geschrieben := CharsInLine - geschrieben;
- ⓪$Length := LENGTH (info);
- ⓪$WriteLine (info);
- ⓪$IF Length > geschrieben THEN info [geschrieben] := nul; blankend [0] := nul;
- ⓪$ELSE WriteConst (Strings.Space (geschrieben - Length));
- ⓪$END;
- ⓪$Normal;
- ⓪"END Vorlauf;
- ⓪
- ⓪ BEGIN (* Edit *)
- ⓪"WITH Puff^ DO
- ⓪$x := MerkPunkte [LaufendeZeile].charpos;
- ⓪$xoffset := MerkPunkte [ErsteZeile].charpos;
- ⓪$IF ((xoffset > x) OR
- ⓪&(xoffset + rScreen < x)) THEN
- ⓪&marginoverflow := TRUE; RETURN;
- ⓪$END (* IF *);
- ⓪$overflow := FALSE; lokaleditiert := FALSE;
- ⓪$marginoverflow := FALSE;
- ⓪#
- ⓪$IF DoVorlauf THEN
- ⓪&Vorlauf;
- ⓪$END;
- ⓪$starty := MerkPunkte [LaufendeZeile].zeilpos -
- ⓪&MerkPunkte [ErsteZeile].zeilpos;
- ⓪$ZeileGueltig := FALSE;
- ⓪$
- ⓪$LOOP
- ⓪&IF zeighelp THEN
- ⓪(CursorAus; HighLight;
- ⓪(IF ~DoVorlauf THEN
- ⓪*ConvCard (MerkPunkte [LaufendeZeile].zeilpos, 5, zeilstr);
- ⓪*GotoXY (17, 0); WriteLine (zeilstr);
- ⓪(END;
- ⓪(GotoXY (27, 0);
- ⓪(ConvCard (x + 1, 3, zeilstr);
- ⓪(WriteLine (zeilstr);
- ⓪(Normal;
- ⓪&END (* IF zeighelp *);
- ⓪&IF x >= xoffset THEN
- ⓪(GotoXY (x - xoffset, starty);
- ⓪&ELSE GotoXY (0, starty);
- ⓪&END;
- ⓪&CursorEin;
- ⓪&LiesZeichen (termch);
- ⓪&IF (termch.TT = Befehl) & ~(termch.bef IN Befehlssatz
- ⓪({InsertBlank, tabulator, DelLChar, DelRChar, DelLWort, DelRWort,
- ⓪)ZeilAnf, ZeilEnde, DelBZeil, DelEZeil, Wortleft, Wortrigt,
- ⓪)cursleft, cursright})
- ⓪(THEN EXIT
- ⓪(ELSIF ~ZeileGueltig THEN
- ⓪*GetLine (MerkPunkte [LaufendeZeile].merkline, s);
- ⓪*Length := LENGTH (s);
- ⓪*ZeileGueltig := TRUE;
- ⓪&END (* IF *);
- ⓪&
- ⓪&IF (x > Length) & ((termch.TT = Zeichen) OR
- ⓪(((termch.TT = Befehl) &
- ⓪)(termch.bef IN Befehlssatz {CutToClipboard, CopyToClipboard, DelLChar,
- ⓪FInsertBlank})))
- ⓪(THEN
- ⓪(IF (x + 1 < HIGH (s)) THEN
- ⓪*FOR ll := Length TO x - 1 DO
- ⓪,s [ll] := ' ';
- ⓪*END (* FOR *);
- ⓪*Length := x;
- ⓪*s [x] := nul;
- ⓪(END (* IF x < HIGH *);
- ⓪&END (* IF auffuellen *);
- ⓪#
- ⓪&IF (termch.TT = Zeichen) THEN
- ⓪(IF (x + 1 < HIGH (s)) THEN
- ⓪*lokaleditiert := TRUE; INC (AutoCount);
- ⓪*IF (OverWrite IN Modus) & ~(s [x] = tab) THEN
- ⓪,IF (x + 1) > Length THEN s [x + 1] := nul;
- ⓪,END (* IF *);
- ⓪,s [x] := termch.zch;
- ⓪,InsChar (termch.zch);
- ⓪*ELSE
- ⓪,d [0] := termch.zch;
- ⓪,Insert (d, x, s);
- ⓪,InsChar (termch.zch); INC (Length);
- ⓪*END (* IF overwrite *);
- ⓪*INC (x);
- ⓪*IF (Length >= cZeile ) OR (Length >= HIGH (s)) THEN
- ⓪,overflow := TRUE;
- ⓪*END (* IF *);
- ⓪(ELSE exit := TRUE;
- ⓪(END; (* IF (x < HIGH (s)) *)
- ⓪&ELSIF termch.TT = Befehl THEN
- ⓪(IF (x > Length) & ~(termch.bef IN Befehlssatz {
- ⓪>cursup, cursdown, cursright, cursleft,
- ⓪>Seitup, Seitdown, ZeilEnde, ZeilAnf,
- ⓪>insert, indent, Einrueck, LeftMous, RightMous,
- ⓪>Rollup, Rolldown, home})
- ⓪(THEN x := Length;
- ⓪(END (* IF *);
- ⓪(
- ⓪"
- ⓪(CASE termch.bef OF
- ⓪*InsertBlank: IF (x + 1 < HIGH (s)) THEN
- ⓪9lokaleditiert := TRUE; INC (AutoCount);
- ⓪9d [0] := ' '; Insert (d, x, s);
- ⓪9InsChar (termch.zch); INC (Length);
- ⓪9INC (x);
- ⓪9IF (Length >= cZeile) OR (Length >= HIGH (s)) THEN
- ⓪;overflow := TRUE;
- ⓪9END;
- ⓪7END (* IF (x + 1... *)
- ⓪7|
- ⓪*tabulator: z := TabWeite * ((x DIV TabWeite) + 1);
- ⓪5IF ~(OverWrite IN Modus) THEN
- ⓪7lokaleditiert := TRUE; INC (AutoCount);
- ⓪7d [0] := ' ';
- ⓪7WHILE (x < cZeile) & (Length + 1 < HIGH (s)) & (x < z) DO
- ⓪9Insert (d, x, s);
- ⓪9INC (x); INC (Length);
- ⓪7END (* WHILE *);
- ⓪7CursorAus; GotoXY (0, starty); (* LoescheZeile; *)
- ⓪7WriteString (xoffset, s); LoescheZeile;
- ⓪5ELSE (* overwrite *)
- ⓪7IF s [x] = tab THEN
- ⓪9IF (x <= cZeile) THEN
- ⓪;INC (x);
- ⓪9ELSE exit := TRUE;
- ⓪9END (* IF *);
- ⓪7ELSE
- ⓪9IF (z <= cZeile) THEN
- ⓪;IF z < Length THEN
- ⓪=WHILE (x < cZeile) & (Length + 1 < HIGH (s))
- ⓪C& (x < z) DO
- ⓪?INC (x); INC (Length);
- ⓪=END (* WHILE *);
- ⓪;ELSE
- ⓪=IF TabFiltern IN Modus THEN d [0] := ' '
- ⓪=ELSE d [0] := tab;
- ⓪=END;
- ⓪=x := Length; (* Am Ende einfügen... *)
- ⓪=WHILE (x < cZeile) & (Length + 1 < HIGH (s))
- ⓪C& (x < z) DO
- ⓪?Insert (d, x, s); INC (x);
- ⓪?INC (Length);
- ⓪=END (* WHILE *);
- ⓪;END (* IF Length *);
- ⓪9ELSE exit := TRUE;
- ⓪9END (* IF *);
- ⓪7END (* IF tabulator *);
- ⓪5END (* IF ~overwrite *);
- ⓪5|
- ⓪*DelLChar: lokaleditiert := TRUE; INC (AutoCount);
- ⓪5IF x > 0 THEN
- ⓪7DEC (x);
- ⓪7IF ~(OverWrite IN Modus) THEN
- ⓪9Delete (s, x, 1); DelChar;
- ⓪7END (* IF *);
- ⓪5ELSE exit := TRUE;
- ⓪5END (* IF *)|
- ⓪*DelRChar: lokaleditiert := TRUE; INC (AutoCount);
- ⓪5IF LENGTH (s) > x THEN Delete (s, x, 1);
- ⓪LDelChar;
- ⓪5ELSE exit := TRUE;
- ⓪5END;|
- ⓪*DelRWort: lokaleditiert := TRUE; INC (AutoCount);
- ⓪5exit := exit OR (LENGTH (s) <= x);
- ⓪5(* !!! Length in Schleife !!! *)
- ⓪5warBlank := FALSE; switch := FALSE;
- ⓪5WHILE (LENGTH (s) > x) & SkipBlank (s [x]) DO
- ⓪7Delete (s, x, 1);
- ⓪5END (* WHILE *);
- ⓪5CursorAus;
- ⓪5GotoXY (0, starty); LoescheZeile;
- ⓪5WriteString (xoffset, s);|
- ⓪*DelLWort: lokaleditiert := TRUE; INC (AutoCount);
- ⓪5(* !!! Length in Schleife !!! *)
- ⓪5IF (x > 0) THEN
- ⓪7warBlank := FALSE; switch := FALSE;
- ⓪7WHILE (x > 0) & SkipBlank (s [x - 1]) DO
- ⓪9Delete (s, x - 1, 1);
- ⓪9DEC (x);
- ⓪7END (* WHILE *);
- ⓪7CursorAus;
- ⓪7GotoXY (0, starty); LoescheZeile;
- ⓪7WriteString (xoffset, s);
- ⓪5ELSE exit := TRUE;
- ⓪5END;|
- ⓪*ZeilAnf: exit := exit OR (x = 0);
- ⓪5x := 0;|
- ⓪*ZeilEnde: exit := exit OR (x = Length);
- ⓪5x := Length;|
- ⓪*DelBZeil: exit := exit OR (x = 0);
- ⓪5lokaleditiert := TRUE; INC (AutoCount);
- ⓪5IF (x > 0) THEN
- ⓪7Copy (s, 0, x, p);
- ⓪7IF undone THEN
- ⓪9Loeschen (UndoPuffer); undone := FALSE;
- ⓪7END;
- ⓪7InsertLine (UndoPuffer, p, FALSE, FALSE, TRUE);
- ⓪7FOR z := 0 TO x - 1 DO
- ⓪9Delete (s, 0, 1);
- ⓪7END (* FOR *);
- ⓪7x := 0;
- ⓪7CursorAus;
- ⓪7GotoXY (0, starty); LoescheZeile;
- ⓪7WriteString (xoffset, s);
- ⓪5END (* IF *);|
- ⓪*DelEZeil: exit := exit OR (x = Length);
- ⓪5IF ~exit THEN
- ⓪7Copy (s, x, Length - 1, p);
- ⓪7IF undone THEN
- ⓪9Loeschen (UndoPuffer); undone := FALSE;
- ⓪7END;
- ⓪7InsertLine (UndoPuffer, p, FALSE, FALSE, TRUE);
- ⓪5END (* IF *);
- ⓪5s [x] := nul; LoescheZeile;
- ⓪5lokaleditiert := TRUE; INC (AutoCount);|
- ⓪*Wortleft: IF (x > 0) THEN
- ⓪6warBlank := FALSE; switch := FALSE;
- ⓪6WHILE (x > 0) &
- ⓪8SkipBlank (s [x - 1]) DO
- ⓪8DEC (x);
- ⓪6END (* WHILE *);
- ⓪5ELSE exit := TRUE;
- ⓪5END (* IF *)|
- ⓪*Wortrigt: IF (x <= cZeile) &
- ⓪8(x + 1 <= Length)
- ⓪5THEN
- ⓪:warBlank := FALSE; switch := FALSE;
- ⓪:WHILE (x <= cZeile) &
- ⓪@(x + 1 <= Length) &
- ⓪@(SkipBlank (s [x])) DO
- ⓪DINC (x);
- ⓪:END (* WHILE *);
- ⓪5ELSE exit := TRUE;
- ⓪5END (* IF *)|
- ⓪*cursleft: IF x > 0 THEN DEC (x);
- ⓪5ELSE exit := TRUE;
- ⓪5END (* IF *)|
- ⓪*cursright: IF (x <= cZeile) THEN
- ⓪7INC (x);
- ⓪5ELSE exit := TRUE;
- ⓪5END (* IF *)|
- ⓪*ELSE;
- ⓪(END (* CASE sc *);
- ⓪((*IF ~exit THEN termch.TT := keineTaste; END;*)
- ⓪&END (* IF..ELSE *);
- ⓪&Length := LENGTH (s);
- ⓪&IF lokaleditiert & ((Length >= cZeile ) OR (Length >= HIGH (s))) THEN
- ⓪(overflow := TRUE;
- ⓪&END (* IF *);
- ⓪&IF ((xoffset > x) OR
- ⓪*(xoffset + rScreen < x)) THEN
- ⓪(marginoverflow := TRUE;
- ⓪&END (* IF *);
- ⓪$(*UNTIL exit OR overflow OR marginoverflow;*)
- ⓪&IF overflow OR marginoverflow OR exit THEN EXIT; END;
- ⓪$END (* LOOP *);
- ⓪$MerkPunkte [LaufendeZeile].charpos := x;
- ⓪$IF lokaleditiert THEN INCL (Modus, Changed); END;
- ⓪"END (* WITH Puff^ *);
- ⓪ END Edit;
- ⓪
- ⓪ (* ENDE EditLine *)
- ⓪
- ⓪
- ⓪ BEGIN (* GMEKernel *)
- ⓪"Trace ('GMEKernel');
- ⓪"tabjump := cTabWeite;
- ⓪
- ⓪ (* BEGIN EditLine *)
- ⓪
- ⓪"Trace ('EditLine');
- ⓪"warBlank := FALSE; switch := FALSE;
- ⓪"rScreen := CharsInLine - 1;
- ⓪ (* END EditLine. *)
- ⓪
- ⓪ END GMEKernel.
- ⓪
- ⓪ ə
- (* $FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$00000AD1$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1EÇ$0000C8BAT.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$00000426$00000436$0000C81E$0000C826$0000045B$0000C841$0000C92B$0000C89F$00000506$0000C8BA$000003CC$FFED0748$000003DA$000003EA$000003FE$00000419¿Çé*)
-